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