0

クラスがあります。それを SomeClass と呼びましょう。SomeClass は INotifyPropertyChanged を実装し、これは次のようにコーディングされます。

public class SomeClass
{
.
.
.
private bool _isDirty;

public bool IsDirty
{
    get { return this._isDirty; }
    set
    {
    this._isDirty = value;
    this.NotifyPropertyChanged("IsDirty");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propertyName)
{
    if (this.PropertyChanged != null)
    {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
}

SomeClassというインスタンスを使用するフォームがありますinstanceOfSomeClass

このプロパティはすべて正しく起動しますが、主な問題は、そのプロパティに [保存] ボタンがバインドされていることです。

<Button Content="Save" Height="23" Name="btnSave" IsEnabled="{Binding Path=IsDirty}" Width="60" Margin="10, 10" HorizontalAlignment="Right" Click="btnSave_Click" />

コンボ ボックスの SelectionChanged イベントは、次のように定義されているプロパティを変更することになっています。

<ComboBox Name="cboListOfUsers" ItemsSource="{Binding}" SelectionChanged="cboSomeCombo_SelectionChanged"/>

(スタイルなど、質問に関係のないコンボボックスの定義の一部を削除しました)

重要なのは、コンボ ボックスの DataContext が instanceOfSomeClass に設定されておらず、カスタム クラスの List に設定されていないことです。

SelectionChanged イベントが発生し、次のようなコードがあります。

instanceOfSomeClass.IsDirty = true;
instanceOfSomeClass.User = (ApplicationUser) cboSomeCombo.SelectedItem;

これは実行され、プロパティを変更して適切な通知を発生させますが、コマンド ボタンは有効になりません。これは、コンボの DataContext がコマンド ボタンの DataContext と異なるためだと推測されます

SelectionChanged イベントで DataContext を変更しようとしましたが、コンボで何も選択されません (ただし、[保存] ボタンは有効になっています)。

どんな助けでも大歓迎です

4

1 に答える 1

0

これは、コンボの DataContext がコマンド ボタンの DataContext と異なるためだと推測されます

いいえ、そうは思いません。データコンテキストのメンバーを使用するか、RelativeSource、ElementName を使用して、ソースまたは別のバインディング構文を直接指定する代わりに、ItemsSource を DataContext に直接バインドしないことで、それを試すことができます。コレクションをデータ コンテキストとして設定せずに、プロパティからコレクションを使用することを強くお勧めします (個人的には、これは非常に悪いスタイルだと思います。{Binding} はめったに使用せず、ContentControls が関係する場合にのみ使用します)。

ボタンの Datacontext を確認し、snoopを使用すると、このようなバグを見つけるのに非常に役立ちます。プロパティが本当に発生していることを確認してください。バグがあった実際の NotifyPropertyChanged に何回踏み込まなかったのか数え切れません。

コマンドは何らかの方法で IsEnabled プロパティを変更するため、ボタンがどこかでコマンドを使用していないことを確認してください。

トリガー、アニメーションなど、誰も IsEnabled プロパティを上書きしていないことを確認してください。

バインド エラーまたは警告の出力を確認し、vs10 を使用する場合はそれらを有効にします。

詳細情報を提供していただければ、回答を更新します。コメントが多すぎました。

于 2012-05-15T11:09:41.860 に答える