0

我目前有一个带有布尔属性的模型,该属性存储一个复选框值。当此值更改(选中/未选中)时,我想显示或隐藏文本框。

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

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

还是我接近这一切都错了?

4

1 回答 1

0

您的 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;
        }
    }
}
于 2013-08-07T17:39:13.973 回答