C# 使用MVVM结构的DataGrid中的单元格单击事件

C# 使用MVVM结构的DataGrid中的单元格单击事件,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,朋友们,我正在WPF C#中创建一个具有以下MVVM结构的小应用程序。 我被困在一个点,即使我不知道如何谷歌它,所以最后想把它留在这里。 您可以从下图中看到,我使用GridView创建了一个表结构。我也在同一个窗口中启用了单个单元格选择 现在我需要的是,当我单击特定单元格时,名为AllowEdit_Text的文本框应该显示所选文本的值,一旦我在该文本框中编辑,它应该会反映回表中。现在我担心的是如何访问所选的单个单元格(甚至我的表也是动态的)。我在这里找到了许多类似链接的文章: 但在这些文章中,

朋友们,我正在WPF C#中创建一个具有以下MVVM结构的小应用程序。 我被困在一个点,即使我不知道如何谷歌它,所以最后想把它留在这里。 您可以从下图中看到,我使用
GridView
创建了一个表结构。我也在同一个窗口中启用了单个单元格选择

现在我需要的是,当我单击特定单元格时,名为
AllowEdit_Text
的文本框应该显示所选文本的值,一旦我在该文本框中编辑,它应该会反映回表中。现在我担心的是如何访问所选的单个单元格(甚至我的表也是动态的)。我在这里找到了许多类似链接的文章:

但在这些文章中,它们都使用了带有发送方参数的后端方法,这只能在视图的编码部分中访问,但由于这篇文章违反了MVVM结构,我不知道如何继续。 请告诉我一个完美的方法,它可以是有帮助的,也遵循MVVM结构

下面是我现有的视图代码,供您参考

车辆形式.xaml

        <Window x:Class="Seris.VehicalForm"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="500" Width="600">
<Control>
    <Control.Template>
        <ControlTemplate>
            <WrapPanel Orientation="Vertical" Margin="10 " >
                <Label Content="Vehical No" HorizontalAlignment="Left"/>
                <TextBox Name="VehicalNo_Text" Height="23" Width="80" TextWrapping="Wrap" Text="{Binding VehicalNo, UpdateSourceTrigger=PropertyChanged}"  HorizontalAlignment="Left" />
                <Label Content="Model" HorizontalAlignment="Left"/>
                <TextBox Name="Model_Text" Height="23" Width="80" TextWrapping="Wrap" Text="{Binding Model, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" />
                <Label Content="Manufacturing Date" HorizontalAlignment="Left"/>
                <DatePicker Name="ManufacturingDate_DateTime" SelectedDate="{Binding ManufacturingDate, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
                <Label Content="IU No" HorizontalAlignment="Left"/>
                <TextBox Height="23" Width="80" Name="IUNO_Text" TextWrapping="Wrap" Text="{Binding IUNo, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left"/>
                <Label Content="Personnel" HorizontalAlignment="Left"/>
                <ComboBox Name="Personnel_Combo" SelectedValue="{Binding PersonnelNameSelected, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding PersonnelName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Left" Width="116"/>
                <Separator Height="20" RenderTransformOrigin="0.5,0.5" Width="16"/>
                <Button Name="Save_Button" Command="{Binding SaveButton_Command}" Content="Save" Width="66"/>
                <Label x:Name="Error_Label" Content="{Binding ErrorMessage, UpdateSourceTrigger=PropertyChanged}" Foreground="Red" HorizontalAlignment="Left" Height="41" Width="137"/>
                <ListView Name ="Grid" Height="294" Width="371" >
                    <DataGrid Name="DG" ItemsSource="{Binding ListItems, UpdateSourceTrigger=PropertyChanged}" SelectionUnit="Cell" GridLinesVisibility="None" IsReadOnly="True" AutoGenerateColumns="False" BorderThickness="0">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Vehical No" Binding="{Binding VehicalNo}" />
                            <DataGridTextColumn Header="Model" Binding="{Binding Model}" />
                            <DataGridTextColumn Header="ManufacturingDate" Binding="{Binding ManufacturingDate}" />
                            <DataGridTextColumn Header="IUNo" Binding="{Binding IUNo}" />
                            <DataGridTextColumn Header="Personnel" Binding="{Binding PersonnelNameSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

                        </DataGrid.Columns>

                    </DataGrid>
                </ListView>
                <TextBlock Name="Notification" Text="{Binding EditText, UpdateSourceTrigger=PropertyChanged}"/>
                <TextBlock Name="AllowEdit_Text"/>
            </WrapPanel>
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, ElementName=Grid}" Value="true">
                    <Setter Property="Text" TargetName="Notification" Value="abc"/>
                </DataTrigger>

            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Control.Template>
</Control>
</Window>

您可以使用MVVMLight框架来使用EventToCommand行为。 例如:

<ListBox Name="list">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick">
      <Command:EventToCommand
           Command="{Binding Path=DataContext.DoSomethingCommand,ElementName=list}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</ListBox>

按以下方式使用SelectedIndex属性

<DataGrid 
    Name="DG" 
    ItemsSource="{Binding ListItems, UpdateSourceTrigger=PropertyChanged}" 
    SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
    SelectionUnit="Cell"
    GridLinesVisibility="None"
    IsReadOnly="True"
    AutoGenerateColumns="False"
    BorderThickness="0">


使用此属性可以在网格中获取所选索引。

最好使用MVVMLight。 我提供了检索网格中选定行的步骤

1。首先是数据网格绑定

XAML

<DataGrid ItemsSource="{Binding friends}" AutoGenerateColumns="False">
为“MouseDoubleClick”事件管理数据网格上的事件

<DataGrid ItemsSource="{Binding ItemSourceDataGrid}" x:Name="dataGridTest" AutoGenerateColumns="False" Height="258" Width="485" Grid.Column="1">
....
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick" >
        <MVVVMLightCommand:EventToCommand Command="{Binding DGSelectionChangedCommand,Mode=OneWay}" CommandParameter="{Binding SelectedItems, ElementName=DataGridTest}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

...
</DataGrid>

希望这有帮助

你能给我的代码举个例子吗?作为初学者,我很容易理解。
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:MVVVMLightCommand="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
<DataGrid ItemsSource="{Binding ItemSourceDataGrid}" x:Name="dataGridTest" AutoGenerateColumns="False" Height="258" Width="485" Grid.Column="1">
....
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick" >
        <MVVVMLightCommand:EventToCommand Command="{Binding DGSelectionChangedCommand,Mode=OneWay}" CommandParameter="{Binding SelectedItems, ElementName=DataGridTest}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

...
</DataGrid>
DGSelectionChangedCommand = new RelayCommand<IList>(DGSelectionChanged);
public RelayCommand<IList> DGSelectionChangedCommand { get; private set;}  
private void DataGridSelectionChanged(IList test)
{
    foreach (var item in test)
    {
        MessageBox.Show(((Friend)item).ID.ToString());
    }
}