Cell使用MVVM结构单击DataGrid中的事件

时间:2014-08-04 02:22:04

标签: c# wpf xaml mvvm

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

enter image description here

现在我需要的是当我点击特定单元格时,名为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>

3 个答案:

答案 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());
    }
}

希望这会有所帮助