XAML 将组件绑定到ViewModel中声明的元素

gc0ot86w  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个菜单和一个TabbedGroup。当我单击其中一个菜单选项时,我想向TabbedGroup添加一个LayoutPanel。
我在MainWindow中有以下元素:

<view:UCMainMenu Grid.Row="1"/>

<dxdo:DockLayoutManager>
    <dxdo:LayoutGroup Orientation="Horizontal">
        <dxdo:TabbedGroup Name="MainTabbedGroup">                   
        </dxdo:TabbedGroup>
    </dxdo:LayoutGroup>       
</dxdo:DockLayoutManager>

问题是菜单是一个有自己的ViewModel的UserControl。主窗口也有自己的ViewModel。我在Menu ViewModel的属性中创建了TabbedGroup,但我不知道如何将其绑定到MainWindow TabbedGroup元素。
我在UCMainMenu ViewModel中有一个TabbedGroup:

public TabbedGroup MainTabbedGroup { get; set; }

当我点击一个菜单选项时,我会向这个TabbedGroup添加一个LayoutPanel:

new TileViewModel()
{
    Caption = "Menu View",
    NavigateCommand = new DelegateCommand(() =>
    {
        LayoutPanel layoutPanel = new();

        MainTabbedGroup.Add(layoutPanel);
    })...

在主窗口中,我尝试将TabbedGroup绑定到ViewModel的Menu中的元素,但我得到一个错误:

((MainWindowViewModel)this.DataContext).Window = this;

((MainMenuViewModel)DataContext).MainTabbedGroup = this.MainTabbedGroup;

我得到这个错误:
System.InvalidCastException:“无法将类型”IntERP.App.ViewModels.MainWindowViewModel“的对象强制转换为类型”IntERP.App.ViewModels. MainMenuViewModel“。”
怎么绑定?

cdmah0mi

cdmah0mi1#

首先,我建议您不要访问视图模型中的控件。这绕过了使用视图模型的全部原因。首先,它使测试视图模型变得更加困难。最好将此逻辑(添加到选项卡组)放在主窗口后面的代码中。
关于你的代码:你想把DataContext转换成MainMenuViewModel,而它是MainWindowViewModel。
你可以做什么:在XAML中执行绑定:

<view:UCMainMenu Grid.Row="1" MainTabbedGroup="{Binding ElementName=MainTabbedGroup}"/>

但是视图模型也不应该关心视觉树的改变。

相关问题