如何使用XAML / MVVM模式识别数据网格的行

本文关键字:数据网 网格 数据 模式识别 何使用 XAML MVVM | 更新日期: 2023-09-27 18:17:37

我正在转换一个事件驱动的应用程序到MVVM,并试图尽量减少代码滞后。其中一个视图有一个DataGrid,我在其中放置了一个列,其中有一个UserControl,它实现了ICommandSource。当你点击控件("LinkLabel")时,应用程序应该为DataRow的绑定对象启动一个新选项卡。因此,我已经将DataGrid的SelectedItem道具绑定到ViewModel中的相应属性。只要用户先选择DataRow,然后单击LinkLabel,一切都可以正常工作。但这不是典型的用户行为。

我的问题是:我怎么能让DataGrid选择父DataRow之前触发命令?我想这不是概念上的解决方案,但它(希望)能让你明白这一点。

DataGrid

<DataGrid Name="dgPeople" MouseDoubleClick="dgPeople_MouseDoubleClick"
      ItemsSource="{Binding CollectionOfPeople}" SelectedValuePath="DatabaseId" SelectedItem="{Binding SelectedPerson}"
      AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="True"
      ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"  
      Grid.Row="1" >
<DataGrid.Columns>
     <DataGridTemplateColumn Header="Name" Width="*">
         <DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                 <view:LinkLabel Content="{Binding FullName}" 
                                 Command="{Binding Source={StaticResource vm}, Path=LaunchPersonDetailCmd}"
                                 FontWeight="Normal" VerticalAlignment="Center" Margin="0" />
             </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
     ...
     <DataGridTextColumn Header="Job Title" Binding="{Binding JobTitle}"
                         Width="*" />
     <DataGridTextColumn Header="Status" Binding="{Binding Status}"
                         Width="*" />
     ...
</DataGrid.Columns>

我可以根据需要提供其他代码,但其他似乎都不相关。

谢谢!

如何使用XAML / MVVM模式识别数据网格的行

有几种不同的方法可以做到这一点。仅视图的方法是使用一种行为来监视在层次结构中冒泡的单击消息并直接操作可视化树,但我个人认为在视图模型中这样做要好得多。我需要看到你的LinkLabel控件,但如果它像标准WPF控件一样,那么它也应该有一个CommandParameter,你可以用它来绑定到行数据上下文,并作为参数传递到你的命令处理程序。然后,只需让处理程序将SelectedItem设置为传入的任何内容即可。

我怀疑的是,你的LinkLabel实际上不是一个必要的控件,它可以被替换为一个常规的数据模板,包含一个模板化的按钮,这将很容易地支持你想要做的事情,但我需要更多的细节关于这个控件实际做什么。