0

私は現在、チェックボックスの値を格納するブール値のプロパティを持つモデルを持っています。この値が変更されたとき(チェックされている/チェックされていない)、テキストボックスを表示または非表示にしたい。

テキストボックスの Visibility プロパティは、モデルではなく ViewModel にあります。チェックボックスの値が変更されたため、Visibility プロパティに表示/非表示を指示する方法がわかりません。

私はすべてのプロパティで RaisePropertyChanged を持っていることを知っています。これは使用できるものだと思いますが、ViewModel でキャプチャする方法がわかりません。

それとも、私はこれにすべて間違って近づいていますか?

4

1 に答える 1

0

ViewModel は、Model と View の間のゲートとして機能する必要があります。チェックボックスがモデルに直接バインドされているようです。モデルに対する適切な値へのコンダクトとして機能する、対応する 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 に答える