如何在 wpf C# 中保持用户控件的当前状态

how to keep current status of usercontrol in wpf C#

所以我在 wpf 中使用用户控件创建了三个视图。我创建了 3 个按钮来更改视图。

MainWindow.xaml.cs

 private void view1_clicked(object sender, RoutedEventArgs e)
        {

            DataContext = new view1model1();

        }

        private void view2_clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new viewmodel2();
        }

        private void view3_clicked(object sender, RoutedEventArgs e)
        {
            DataContext =new view1model3();
        }

假设我在 view2 中有文本块,当我第一次单击 view2 时,它的可见性是故意折叠的。

 public Classification()
        {
            InitializeComponent();
            if(condition == null)
            {
                someControl.Visibility = Visibility.Collapsed;
             
            }
            
           private void condition_changed(object sender, SelectionChangedEventArgs e)
            {
            if(someControl.Visibility == Visibility.Collapsed)
            {
                someControl.Visibility = Visibility.Visible;
            }
            

        }

并且在 view2 中,有一个条件控件触发 someControl.visibility = collapsed to visible。

但问题是当我点击 view3 或 view1 然后返回 view2 时,somecontrol 变成了 collapsed。

我知道这是因为我在构造函数中将 'someControl' 设置为折叠。但是我不知道如何让它按我的意愿工作。

简而言之,我想在开始时将 somecontrol.visibility 设置为折叠,但是一旦它在触发条件后变为可见,我想保持它可见直到我在 view2 中单击刷新按钮稍后再创作。

您有两个选择:

  • 不要在每次单击按钮时都创建新的视图模型对象。相反,在 MainWindow 构造函数中创建三个对象,将引用存储在 class 的私有字段中,并在单击按钮时将 DataContext 设置为适当的引用。例如:
partial class MainWindow : Window
{
    private readonly model1 = new view1model1();
    private readonly model2 = new viewmodel2();
    private readonly model3 = new view1model3();

    private void view1_clicked(object sender, RoutedEventArgs e)
    {
        DataContext = model1;
    }

    private void view2_clicked(object sender, RoutedEventArgs e)
    {
        DataContext = model2;
    }

    private void view3_clicked(object sender, RoutedEventArgs e)
    {
        DataContext = model3;
    }
}
  • 在设置 DataContext 之前,将控制可见性的条件存储在字段中,并根据存储的值初始化视图模型对象的状态。例如:
partial class MainWindow : Window
{
    private bool showSomeControl = false;

    private void view1_clicked(object sender, RoutedEventArgs e)
    {
        showSomeControl = condition;
        DataContext = new view1model1();
    }

    private void view2_clicked(object sender, RoutedEventArgs e)
    {
        condition = showSomeControl;
        DataContext = new viewmodel2();
    }

    private void view3_clicked(object sender, RoutedEventArgs e)
    {
        showSomeControl = condition;
        DataContext =new view1model3();
    }

请注意,以上内容基于您发布的代码。问题中没有足够的细节,因此您必须从上面的示例中推断出您自己的代码中的实际更改究竟是什么样子。

此外,更重要的是要注意,更一般地说,根据您发布的代码,我会说您滥用了 WPF,并且会发现它更难让事情正常工作。例如,与其直接订阅 Click 事件,不如将操作抽象为 ICommand 并在命令的处理程序中更新状态。同样,不要直接在Classificationclass中修改Visibility属性,控件的可见性应该直接绑定到控制它的视图模型属性。使用 DataTriggerIValueConverter 将视图模型 属性 值映射到实际 Visibility 值。