繁体   English   中英

模型视图中的WPF更改控制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM