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

Posted

技术标签:

【中文标题】如何在wpf C#中保持用户控件的当前状态【英文标题】:how to keep current status of usercontrol in wpf C# 【发布时间】:2021-01-20 21:37:00 【问题描述】:

所以我在 wpf 中使用 usercontrol 创建了三个视图。我创建了 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 更改为折叠。

我知道这是因为我在构造函数中将“someControl”设置为折叠。但我无法弄清楚如何让它按我的意愿工作。

为了简短起见,我想在开始时将 somecontrol.visibility 设置为折叠,但是一旦在触发条件后将其更改为可见,我想保持它可见,直到我单击要执行的 view2 中的刷新按钮以后再创作。

【问题讨论】:

【参考方案1】:

你有两个选择:

不要在每次单击按钮时创建新的视图模型对象。相反,在MainWindow 构造函数中创建三个对象,将引用存储在类的私有字段中,并在单击按钮时将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 并更新命令处理程序中的状态。同样,与其直接在Classification 类中修改Visibility 属性,不如直接将控件的可见性绑定到控制它的视图模型属性。使用DataTriggerIValueConverter 将视图模型属性值映射到实际的Visibility 值。

【讨论】:

以上是关于如何在wpf C#中保持用户控件的当前状态的主要内容,如果未能解决你的问题,请参考以下文章

当前控件的工具提示中的 WPF C# 状态栏标签内容

如何从自定义用户控件 WPF、C# 中的枚举自定义属性中获取值?

c# winform 如何取得用户控件中 的值

C#中如何实现WPF调用Winform中用户自定义的控件呢?

请问如何在c#中用WPF调用Winform变写的用户控件,知道的请给予解说,谢谢!

如何从继承的用户控件访问 viewModel 依赖属性?