模型视图中的WPF更改控件

时间:2013-12-08 13:59:34

标签: c# .net wpf

我创建了一个类似于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内容?实际上,用另一个控件替换当前的登录控件。

1 个答案:

答案 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项目并将代码放在上面。