0

現在、選択した行の実際のデータバインドされたオブジェクトをデータグリッド(WPF)から次の方法で取得しています:

private void PointListDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    PointItem pointItem = (sender as DataGrid).CurrentItem as PointItem;
}

うまくいきますが、これはエレガントではなく、2 回キャストする必要があります。

Treeview には、イベント引数からデータバインドされたオブジェクトを取得できる SelectedItemChanged イベントがありましたが、DataGrid に対して同じことを行う方法が見つかりませんでした。

選択した行のデータバインドされたオブジェクトを取得するにはどうすればよいですか?

4

1 に答える 1

1

PointItem 型のプロパティを DataContext クラス (たとえば、DataGrid を含む Window または Page クラス) に追加し、CurrentItem プロパティをこのプロパティにバインドするだけです。次に、Data Binding がキャストを処理するので、手動で行う必要はありません。

    public PointItem CurrentPointItem
    {
        get { return (PointItem)GetValue(CurrentPointItemProperty); }
        set { SetValue(CurrentPointItemProperty, value); }
    }

    // Using a DependencyProperty as the backing store for CurrentPointItem.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty CurrentPointItemProperty =
        DependencyProperty.Register("CurrentPointItem", typeof(PointItem), typeof(MainWindow), new PropertyMetadata(null));

および xaml (もちろん、DataGrid の DataContext プロパティまたはその親の 1 つを CurrentPointItem プロパティを含むオブジェクトに設定する必要があります):

<DataGrid CurrentItem={Binding CurrentPointItem} />

次のようにイベントを書くことができます:

private void PointListDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    PointItem pointItem = CurrentPointItem;
    if (pointItem == null)
    {
        //no item selected
    }
}
于 2013-07-02T16:10:00.623 に答える