如何使用 MVVM 模式将子元素添加到 WPF 中的网格

Kir*_*ran 6 c# wpf mvvm

我正在尝试通过 mvvm 模式中的绑定而不是隐藏代码向网格控件添加一个子元素。

查看代码:

<Grid  Name="grid">

</Grid>
Run Code Online (Sandbox Code Playgroud)

背后代码:

    public MainWindow()
    {
        InitializeComponent();
        AddControl();
    }

    private void AddControl()
    {
        Viewer viewer = new Viewer();
        grid.Children.Add(viewer.GetUIElement());
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但我想在虚拟机中通过绑定而不是代码隐藏来完成此操作。请注意,在上面的代码中,Viewer 是第三方控件,它通过后面的代码完美地添加到网格中。我想使用绑定动态地将查看器控件添加到网格中。

并不总是需要有网格控件。它可以是任何控件,例如父控件/托管控件/内容控件。只有一个子控件,即 Viewer。

我有 ICommand、INotifyPropertyChanged、依赖属性等绑定的基本知识,但现在知道如何将任何控件(在我的例子中为 Viewer)添加到另一个父控件(在我的例子中为 Grid)。

代码可能如下:View和VM通过DataContext绑定

查看代码:

<ContentControl Content="{Binding MyControl}"></ContentControl>
Run Code Online (Sandbox Code Playgroud)

虚拟机代码:

class VM
{
    Viewer view;
    public VM()
    {
        view = new Viewer();
    }
    public Viewer MyControl
    {
        get {return view; }
        set{view= value;}
    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*ran 2

当我在问题中发布示例代码时,我尝试了相同的操作,并通过在相同的代码中进行一些更正,我找到了解决方案。唯一的问题是我想编写 UIElement 类型的属性而不是 Viewer 类型。

查看代码:

<ContentControl Content="{Binding MyControl}"></ContentControl>
Run Code Online (Sandbox Code Playgroud)

虚拟机代码:

class VM
{
    Viewer view;
    public VM()
    {
       view = new Viewer();
    }
    public UIElement MyControl
    {
       get {return view.GetUIElement(); }//Set is not necessary
    }
}
Run Code Online (Sandbox Code Playgroud)

与 Grid 后面的代码的情况一样,我没有直接将 Viewer 控件添加为 Grid 的子项,而是接收其 UIElement,然后将其添加到网格中。同样的,我没有直接写Viewer类型的属性,而是写了UIElement类型的属性。

这样,我找到了如何使用MVVM模式在WPF中动态地将任何控件添加到父控件中的解决方案。