朋友们,我正在使用以下MVVM结构在WPF C#中创建一个小应用程序。
我坚持一点,即使我不知道如何谷歌它,所以最后想到保持它在这里。
您可以从下面的图像中看到我使用GridView
表格结构。我也启用了单个单元格选择。
现在我需要的是当我点击特定单元格时,名为AllowEdit_Text
的TextBox应显示所选文本的值,并且一旦我在此TextBox中编辑,它应该反映回表格。现在我担心的是如何访问所选择的单个单元格?(甚至我的表格也是动态的)。我找到了许多文章,例如链接:How do i handle cell double click event on WPF DataGrid, equivalent to windows DataGrid's Events?
但是在这些文章中,他们都使用Sender参数的后端方法,只能在View的编码部分访问,但由于这是违反MVVM结构,我很困惑如何继续。 请告诉我一个有用的完美方式,并遵循MVVM结构。
以下是我现有的查看代码供您参考。
VehicalForm.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>
答案 0 :(得分:1)
您可以使用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>
答案 1 :(得分:0)
以下列方式使用SelectedIndex属性
<DataGrid Name="DG" ItemsSource="{Binding ListItems, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" SelectionUnit="Cell" GridLinesVisibility="None" IsReadOnly="True" AutoGenerateColumns="False" BorderThickness="0">
使用此属性,您可以在网格中获取所选索引
答案 2 :(得分:0)
最好使用MVVMLight。 我为您提供了检索网格中选定行的步骤。
1。首先是数据网格绑定
XAML
<DataGrid ItemsSource="{Binding friends}" AutoGenerateColumns="False">
隐藏代码
private ObservableCollection<Friend> _friends;
public ObservableCollection<Friend> friends
{
get { return _friends; }
set { _friends = value;
RaisePropertyChanged(); }
}
2。 DataGrid点击事件,您可以通过不同的方式来执行此操作,具体取决于您是要管理单行选择还是管理多行选择。 在这种情况下,我将向您展示如何管理多重选择,它也可以用于单行选择,也可以使用网格的SelectedItem属性。
添加到视图中以能够使用MVVMLight事件的引用
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:MVVVMLightCommand="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
管理“ 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>
视图模型的构造器,如您所见,RelayCommand将收到与所选行相对应的对象列表。
DGSelectionChangedCommand = new RelayCommand<IList>(DGSelectionChanged);
视图模型-RelayCommand
public RelayCommand<IList> DGSelectionChangedCommand { get; private set;}
视图模型-在其中检索选定行的列表<>。
private void DataGridSelectionChanged(IList test)
{
foreach (var item in test)
{
MessageBox.Show(((Friend)item).ID.ToString());
}
}
希望这会有所帮助