0

私は 2 つの DataGrid を持っており、それぞれが次のように dataSource にバインドされています。

ItemsSource="{Binding Data, ElementName=EmpSource, Mode=TwoWay}"

最初の DataGrid(dgJob) には が含まれJob、2 番目の (dgEmp) にemployeejob.

すべての従業員を EmpSource に保持し、最初のデータグリッドで選択したジョブにリンクされている従業員のみを dataGrid に表示したいと考えています。

だから私は dgJob selectionChanged イベントでこれをやっています:

dgEmp.ItemsSource = null;
var lstEmp = EmpSource.DataView.OfType<Emp>().Where(ores => ores.IdJob == itmJobSelect.IdJob).ToList();
dgEmp.ItemsSource = lstEmp;

問題は、データグリッドで選択した行をジョブで変更してもデータグリッドがクリアされないため、ジョブごとに dgEmp にすべての従業員を表示し、ジョブに接続されている従業員のみを表示する必要があることです。

dataSource を決定する xaml の行を削除できますが、これを行うと、dataSource に変更があったときに dataGrid を更新する必要があります。

しかし、dataSourceの変更後に毎回3行を書き込まない限り、(少なくとも初めて)更新する方法がわかりません。

誰かが私の問題の解決策を見つけるのを手伝ってくれますか?

ありがとうございました。

4

1 に答える 1

0

MVVM デザイン パターンを使用することをお勧めします。データをビュー モデル クラスにロードし、INotifyCollectionChanged インターフェイスを実装するコレクションに格納する必要があります。ビュー モデルは INotifyPropertyChanged インターフェイスも実装する必要があります。

従業員コレクションが変更されたら、次のコードのように 2 番目のコレクションをフィルターする必要があります。

Jobs.CollectionChanged += (sender, args) =>
{
    Employees = AllEmployees.Where(c=> c.IdJob == SelectedJob.IdJob);
}

SelectedJob が変更され、DataGrid が更新されるときにも同じことを行う必要があります。

これは、プロパティ変更通知を実装し、正しいバインドが指定されている場合にのみ機能します。

以下は、記述する必要があるプロパティ変更の実装の例です。

public class ViewModel : INotifyPropertyChanged
{
    public IEnumerable<Emp> Employees
    {
       get { return _employees; }
       set
       {
           if (_employees != value)
           {
               _employees = value;
               OnPropertyChanged("Employees");
           }
       }
    }

    /* ... */

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

また、バインドを機能させるには、ビュー モデル インスタンスを DataContext に割り当てる必要があります。たとえば、コード ビハインド ファイル コンストラクターでは次のようになります。

public void Page()
{
    DataContext = new ViewModel();
    InitializeComponent();
}
于 2013-09-20T16:48:23.450 に答える