2

INotifyPropertyChanged を実装するモデルに変換する DataTable があります。

これは、チェックボックスを含むリストボックスにバインドされます。チェックボックスがチェックされると、PropertyChanged イベントが発生します。DataTable にバインドされた DataGrid があるため、これを処理したいと考えています。チェックされた項目に基づいてその DataTable をフィルター処理したいと思います。

MainWindow.xaml.cs の PropertyChange イベントをサブスクライブしたいのですが、モデルのコンストラクターにハンドラーを登録すると、ハンドラーが 1 つだけ必要であると仮定すると、X 個の量のハンドラーが作成されるため、その方法がわかりません。

ここに私が持っているものがあります:

var categoryModel = ds.Tables[1].Rows.Cast<DataRow>()
                                .Select(x => x["Category"].ToString())
                                .Distinct()
                                .Select(y => new LanguageCategory { CategoryName = y, IsChecked = true });

public class LanguageCategory : INotifyPropertyChanged
    {
        private string categoryName;
        private bool isChecked;
        public event PropertyChangedEventHandler PropertyChanged;

        public string CategoryName
        {
            get { return categoryName; }
            set
            {
                categoryName = value;
                NotifyPropertyChanged("CategoryName");
            }
        }

        public bool IsChecked
        {
            get { return isChecked; }

            set
            {
                isChecked = value;
                NotifyPropertyChanged("IsChecked");
            }
        }


        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
4

2 に答える 2

3

DataChanged などのパブリック イベントと、DataChanged イベントを発生させるパブリック メソッドを持つ新しいクラス "Notifier" を作成します。次に、プロパティが変更された実装を変更します。

public bool IsChecked
        {
            get { return isChecked; }

            set
            {
                isChecked = value;
                NotifyPropertyChanged("IsChecked");
                Notifier.RaiseDataChanged();
            }
        }

MainWindow.xaml の Notifier.DataChanged イベントをサブスクライブする

于 2012-09-12T10:51:30.530 に答える
2

LanguageCategoryのいずれかがチェックされたときに MainWindow に通知する必要があります。選択肢は 2 つあります。

1) のリストを作成するときはLanguageCategory、それぞれの PropertyChanged イベントをサブスクライブします。リストを再作成するときは、忘れずに購読を解除する必要があります。

2) MainWindow でコールバック メソッドを作成し、各 LanguageCatagory を作成するときにデリゲートを渡します。LanguageCategory は、その IsChecked が変更されたときにこれを呼び出すことができます。これは JesseJame の答えに似ていますが、別のクラスは関係ありません。1 に対するこの利点は、リストが変更されたときにクリーンアップが必要ないことです。

2) のコード例

var categoryModel = ds.Tables[1].Rows.Cast<DataRow>()
                      .Select(x => x["Category"].ToString())
                      .Distinct()
                      .Select(y => new LanguageCategory(OnChecked) { CategoryName = y, IsChecked = true });

public void OnChecked()
{
   //reload list or whatever
}


public class LanguageCategory : INotifyPropertyChanged
{
    private string _categoryName;
    private bool   _isChecked;
    private Action _checkedCallback;

    public event PropertyChangedEventHandler PropertyChanged;

    public LanguageCategory(Action checkedCallback)
    {
       _checkedCallback = checkedCallback;
    }

    public string CategoryName
    {
        get { return _categoryName; }
        set
        {
            _categoryName = value;
            NotifyPropertyChanged("CategoryName");
        }
    }

    public bool IsChecked
    {
        get { return _isChecked; }

        set
        {
            _isChecked = value;
            NotifyPropertyChanged("IsChecked");
            _checkedCallback();
        }
    }

    //snip rest of code
}
于 2012-09-12T11:29:38.683 に答える