我创建了一个类似于Binding ContentControl Content for dynamic content的解决方案。但我一直在改变一些事情。
例如,我创建了一个简单的登录命令。哪个效果很好。我创建了一个按钮,我将其绑定到登录命令。
public RelayCommand LoginCommand {
get {
return new RelayCommand(Login);
}
}
public void Login(object o) {
if (Membership.ValidateUser(Username, Password)) {
ErrorVisible = Visibility.Hidden;
} else {
ErrorVisible = Visibility.Visible;
}
}
我对此进行了测试,效果很好。但是当登录成功时,我想将用户控件更改为其他内容。但我不知道该怎么做。如何在视图模型中更改ContentControl内容?实际上,用另一个控件替换当前的登录控件。
答案 0 :(得分:0)
您可以照常绑定:
<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;
}
和其他窗口代码。我创建了一个VM的实例,并用一个新的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项目并将代码放在上面。