2

メソッドを呼び出すダブルクリックイベントセッターを設定したDataGridがあります。以下は私のxamlで、次は私のコードビハインドページです。ダブルクリックイベントは機能しますが、返されるのは「system.data.datarowview」であり、その理由はわかりません。非表示になっている独自の列である行の「vehicleID」値を取得しようとしています。

XAML:

<DataGrid Name="OpenVehicles" AutoGenerateColumns="False" IsReadOnly="False" SelectedItem="{Binding vehicleID}" SelectionUnit="FullRow">
<DataGrid.ItemContainerStyle>
    <Style TargetType="DataGridRow">
        <EventSetter Event="MouseDoubleClick" Handler="OpenVehicleClick" />
    </Style>
</DataGrid.ItemContainerStyle>
<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding vehicleID}" Width="*" Header="vehicleID" Visibility="Hidden"/>
    <DataGridTextColumn Binding="{Binding date, StringFormat=\{0:MMM dd yyyy \}}" Width="*" Header="Date"/>
    <DataGridTextColumn Binding="{Binding companyshortname}" Width="*" Header="Customer"/>
    <DataGridTextColumn Binding="{Binding subject}" Width="5*" Header="Vehicle Description"/>
    <DataGridTextColumn Binding="{Binding FName}" Width="*" Header="Owner"/>
</DataGrid.Columns>

C#コード:

        private void OpenVehicleClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(OpenVehicles.CurrentCell.Item.ToString());
    }

列の値を取得する方法やその他の提案についてのアイデアは大歓迎です。私は困惑を超えています。

4

3 に答える 3

1

DataRowView.Rowプロパティには、必要なが含まれますDataRow。そこから、DataRowView.Row["ColumnName"]インデクサーを使用して列の値にアクセスできます

于 2012-11-18T00:57:14.263 に答える
1

XAMLのこのビット:SelectedItem="{Binding vehicleID}"選択したデータ項目がグリッドのDataContextのプロパティにバインドされることを意味しますvehicleID(これは、それが存在するコントロール/ページから継承されます)。

グリッド上のItemsSourceの言及を除外していることに気付きましたvehicleID。このプロパティは、ItemSourceプロパティと同じクラスにある必要があります。これがフィールドではなくパブリックプロパティであることを確認する必要がありvehicleIDます。フィールドにデータバインドすることはできません。したがって、設定方法に応じて、いくつかのオプションがあります。

pubic class MyPage
{
    public MyPage()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private void OpenVehicleClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(VehicleID != null ? VehicleID.WhateverProperty : "Nothing selected");
    }

    public MyDataObject VehicleID { get; set; }
} 

または、ページ/コントロールのDataContextに個別のビューモデルが割り当てられている場合:

private void OpenVehicleClick(object sender, RoutedEventArgs e)
{
    var selectedDataItem = ((MyViewModel) DataContext).VehicleID;
    MessageBox.Show(selectedDataItem != null ? selectedDataItem.WhateverProperty : "Nothing selected");
}
于 2012-11-18T01:29:23.813 に答える
0

現在、グリッド自体を参照しています。イベントは行を処理するため、イベントパラメータを使用して、選択した行で必要なものを見つけます(デバッグで調査します)。

于 2012-11-18T00:59:57.117 に答える