我有一个包含数据网格的WPF应用程序。它绑定到我的List对象“Orders”,如下所示。
public class OrderBlock
{
public Settings setting;
public List<Order> orders;
}
public class Order
{
public int Amount;
public string OrderID;
public string OrderIDDup;
public string Name;
public string NameDup;
public bool DupIDs;
// and some string, int fields
}
由于我无法控制的原因,可能有多个OrderID,因此OrderIDDup属性。默认情况下,我的datagrid只显示OrderID而不显示OrderIDDup。
我想要做的是让用户能够点击单元格ID并加载另一个窗口以显示另一个ID以及两个名称,并让他们选择应该使用哪个ID。
我一直在读,WPF DataGrid不支持双击单元格的功能。所以我有点迷失,因为我应该如何开始解决这个问题。我可以看到的另一个问题是,当我尝试(作为操作词)使用MVVM设计时,这种事件将如何暴露给我的视图模型?
这也是展示此类信息的最佳方式。
任何帮助都会很棒, 谢谢, 中号
答案 0 :(得分:23)
您可以双击网格
,而不是双击单元格 <DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding Edit}" CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" />
</DataGrid.InputBindings>
在ViewModel中
public ICommand Edit { get; private set; }
Edit = new RelayCommand(EditUser, x => _isAdmin);
private static void EditUser(object usr)
{
if (!(usr is User))
return;
new UserEditorViewModel(usr as User);
}
答案 1 :(得分:1)
private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs)
{
if (sender == null) return;
if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed
var dataGrid = sender as DataGrid;
if (dataGrid == null || dataGrid.SelectedItems == null) return;
if (dataGrid.SelectedItems.Count == 1)
{
var simplePension = dataGrid.SelectedItem as ISimplePension;
if (simplePension != null)
{
DataFetcherHolder.DataFetcher.SelectPension(simplePension);
Execute(EditSelectedPensionFunction);
}
}
}
答案 2 :(得分:1)
我们可以通过两种方式做到这一点,
a)使用Dependency属性 b)添加System.Windows.Interactivity.dll。
通常我更喜欢第二种方式。
步骤1:在视图模型类文件中实现ICommand接口。
第2步:定义你的命令,
public ICommand DoubleClickCommand
{
//Do your code
}
第2步:将上述.dll添加到相应解决方案的xaml文件中。
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
步骤3:在Datagrid标记内,使用以下代码实现InvokeCommandAction类
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="DoubleClickCommand"/>
</i:EventTrigger>
<i:Interaction.Triggers>
那就是它。希望它可以帮助你:)
答案 3 :(得分:0)
我使用了MouseDoubleClick:
private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs)
{
if (sender == null) return;
if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed
var dataGrid = sender as DataGrid;
if (dataGrid == null || dataGrid.SelectedItems == null) return;
if (dataGrid.SelectedItems.Count == 1)
{
var simplePension = dataGrid.SelectedItem as ISimplePension;
if (simplePension != null)
{
DataFetcherHolder.DataFetcher.SelectPension(simplePension);
Execute(EditSelectedPensionFunction);
}
}
}
当您双击数据网格时,该行也会被选中,因此我只需找到所选项目并使用它。