【问题标题】:WPF change control in modelview模型视图中的 WPF 更改控制
【发布时间】:2013-12-25 14:17:53
【问题描述】:

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

【问题讨论】:

  • 您可以将两个控件叠加在一个网格中,并在您的视图模型中切换每个控件的可见性。

标签: c# .net wpf


【解决方案1】:

你可以照常绑定:

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

【讨论】:

  • 但这是加载另一个用户控件?我的目标是用另一个替换控件。所以当有人登录时:替换内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多