1

WPF アプリに Model View View-Model パターンを使用しています。2 つのプロパティを持つ ViewModel (ページの DataContext として設定) があり、そのうちの 1 つは PropertyChanged イベントを持つエンティティです。イベント ハンドラーで、他のプロパティ (ブール値) の値を何らかの値に設定します。

これで、Button と TextBox のプロパティが最初の読み込みで適切にバインドされ、PropertyChanged イベントが発生して処理が行われます。ただし、ボタンの IsEnable プロパティは、バインド先のプロパティの変更を反映するために更新されません。

ViewModel は次のようになります。

public sealed class CustomerPageViewModel
{ 
    public Customer Customer
    {
        get;
        set;
    }

    public bool Editing
    {
        get;
        private set;
    }   

    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        Editing = true;
    }
}

そして、xaml sorta は次のようになります。

<TextBox Text="{Binding Customer.Name}" />   
<Button Content="Save Changes" IsEnabled="{Binding Editing}" />

ViewModel の基になるプロパティを変更するときに、ボタンの IsEnable プロパティを更新するにはどうすればよいですか?

4

2 に答える 2

4

それはあなたの ViewModel の実際のコードですか? もしそうなら、ViewModel が INotifyPropertyChanged を実装していないことが問題です。WPF は、「編集中」の VM プロパティが変更されたことを認識できないため、ボタンのバインディングを更新していません。

于 2009-06-26T01:53:25.897 に答える
2

コードが に設定Editingされている場合、それはイベントtrueをトリガーしていないように見えるため、は のバインディングを更新する必要があることを認識していません。次のようなことを試してください:PropertyChangedButtonIsEnabled

public sealed class CustomerPageViewModel : INotifyPropertyChanged
{ 
    public Customer Customer
    {
        get;
        set;
    }

    private bool editing = false;
    public bool Editing
    {
        get { return editing; }
        private set
        {
            editing = value;
            Customer_PropertyChanged(this, new PropertyChangedEventArgs("Editing");
        }
    }   

    public event PropertyChangedEventHandler PropertyChanged;
    private void Customer_PropertyChanged(object sender,
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        PropertyChanged(this, e);

        if(!e.PropertyName.Equals("Editing"))
        {
            Editing = true;
        }
    }
}

Editingイベントが発生した原因ではないことを確認する必要があることに注意してください。PropertyChangedそうしないと、無限ループが発生します。

于 2009-06-26T01:54:06.020 に答える