我正在尝试通过 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)
当我在问题中发布示例代码时,我尝试了相同的操作,并通过在相同的代码中进行一些更正,我找到了解决方案。唯一的问题是我想编写 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中动态地将任何控件添加到父控件中的解决方案。
| 归档时间: |
|
| 查看次数: |
3548 次 |
| 最近记录: |