你可以照常绑定:
<ContentControl Content="{Binding Path=PropertyWithUI}"/>
在代码中:
public UIElement PropertyWithUI
{
get
{
return propertyWithUI;
}
set
{
propertyWithUI = value;
// notify property changed here
}
}
但这不是最好的方法,最好将两个控件都放在窗口上,并将它们的可见性属性绑定到 VM 中的属性。
编辑:
这是一个例子:
在 XAML 中,我有一个内容控件和一个按钮:
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" Content="{Binding Path=Control}"></ContentControl>
<Button Grid.Row="1" Height="40" Click="Button_Click">Change control</Button>
</Grid>
在代码中:
一个小型的自定义 MVVM:
public class MyMVVM : INotifyPropertyChanged
{
private UIElement control;
public UIElement Control
{
get { return control; }
set
{
if (control == value)
return;
control = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Control"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
和其他窗口代码。我创建了一个虚拟机实例并使用新的 TextBox 初始化 Control 属性;
readonly MyMVVM mvvm = new MyMVVM();
public MainWindow()
{
InitializeComponent();
DataContext = mvvm;
mvvm.Control = new TextBox() {Text = "this is a text box"};
}
当用户点击时,我将控制权更改为其他。
private void Button_Click(object sender, RoutedEventArgs e)
{
var wb = new WebBrowser();
mvvm.Control = wb;
wb.Navigate("http://stackoverflow.com");
}
你可以在家里试试 :) 创建新的 WPF 项目并将代码放在上面。