【问题标题】:Capturing RaisePropertyChanged from MVVM Light?从 MVVM Light 捕获 RaisePropertyChanged?
【发布时间】:2013-08-09 05:06:31
【问题描述】:

我目前有一个带有布尔属性的模型,用于存储复选框值。当这个值改变时(选中/取消选中)我想显示或隐藏一个文本框。

现在我的文本框的 Visibility 属性在我的 ViewModel 中,而不是在我的模型中。我不确定如何告诉我的 Visibility 属性它应该显示/隐藏,因为复选框的值发生了变化。

我知道我拥有 RaisePropertyChanged 的​​所有属性,我认为这是我可以使用的东西,但我不知道如何在我的 ViewModel 中捕获它。

或者我是不是把这一切都搞错了?

【问题讨论】:

    标签: c# .net windows-phone-7 mvvm mvvm-light


    【解决方案1】:

    您的 ViewModel 应该充当您的模型和视图之间的大门。看起来您的复选框直接绑定到模型。它应该绑定到相应的 View Model 属性,该属性将作为对您的模型的适当值的行为。例如(免责声明:我没有使用过 MVVM Light,但对于大多数 MVVM 框架来说,它应该是不言自明的):

    public class Chobo2
    {
        public bool IsChecked {get;set;}
    }
    
    public class Chobo2ViewModel // Your base class and interfaces
    {
        private Chobo2 model;
    
        public bool IsChecked
        {
            get { return model.IsChecked; }
            set 
            {
                if(model.IsChecked == value) return;
    
                model.IsChecked = value;
                RaisePropertyChanged("IsChecked");
                RaisePropertyChanged("Visibility");
            }
        }
    
        public System.Windows.Visibility Visibility
        {
            get 
            { 
                return IsChecked 
                           ? System.Windows.Visibility.Visible
                           : System.Windows.Visibility.Collapsed;
            }
        }
    }
    

    如果您的模型本身实现了INotifyPropertyChanged 接口并且无法更改您的视图模型逻辑(即您的视图直接绑定到模型的属性),您所能做的就是听取PropertyChanged 上的更改事件。

    // Assume the Chobo2 class implements INPC
    public class Chobo2ViewModel // Your base class and interfaces
    {
        private Chobo2 model;
    
        public Chobo2ViewModel(Chobo2 model)
        {
            // Should check for null here
            this.model = model;
            this.model.PropertyChanged += (sender, args) => 
                {
                    if(args.PropertyName == "IsChecked")
                        RaisePropertyChanged("Visibility")
                }
        }
    
        public System.Windows.Visibility Visibility
        {
            get 
            { 
                return model.IsChecked 
                           ? System.Windows.Visibility.Visible
                           : System.Windows.Visibility.Collapsed;
            }
        }
    }
    

    【讨论】:

    • 我对 Chobo2 模型在构造函数中的来源有点困惑。我在刚刚观看的 MVVM Light 视频中看到了,是的,您的外观与视频显示的内容非常相似,但除非我误解了 MVVM light 的创建者喜欢在这种情况下从模型中绑定的东西,否则我会展示以避免重复。您可以在 9 分钟左右看到这个视频channel9.msdn.com/events/MIX/MIX11/OPN03。
    • 如果您直接将视图绑定到模型,您的视图模型需要订阅PropertyChanged 事件(构造函数中的模型是一个人为的简短示例)。或者在您的视图中使用值转换器(想到BooleanToVisibilityConverter)。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2017-01-17
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多