[英]WPF change control in modelview
我创建了一个类似于将ContentControl 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内容? 因此,实际上,将当前的登录控件替换为另一个控件。
您可以照常绑定:
<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项目并将代码放在上面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.