[英]WPF Datagrid Double Click Cell MVVM Design
我有一個包含數據網格的 WPF 應用程序。 它綁定到我的列表對象“訂單”,如下所示。
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 屬性。 默認情況下,我的數據網格只顯示 OrderID 而不是 OrderIDDup。
我想做的是讓用戶能夠單擊單元格 ID 並加載另一個窗口以向他們顯示另一個 ID 以及兩個名稱,並讓他們選擇應該使用哪個 ID。
我一直在閱讀 WPF DataGrid 不支持雙擊單元格的功能。 所以我有點迷茫,因為我應該如何開始處理這個問題。 我可以看到的另一個問題是,當我嘗試(作為操作詞)使用 MVVM 設計時,如何將這種事件暴露給我的視圖模型?
這也是顯示此類信息的最佳方式。
任何幫助都會很棒,謝謝,M
您可以雙擊網格而不是雙擊單元格
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick"
Command="{Binding Edit}"
CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" />
</DataGrid.InputBindings>
在視圖模型中
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);
}
我們可以通過兩種方式做到這一點,
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="{Binding DoubleClickCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
而已。 希望對你有幫助:)
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);
}
}
}
我用過 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);
}
}
}
當你雙擊一個數據網格時,該行也被選中,所以我只是找到選中的項目並使用它。
假設
public Icollection<MyGridData> MyGridTable {get; private set;}
public MyGridData MyData {get; private set;}
public MyClass()
{
MyGridData = new MyGridData();
/// assume datas had set
MyGridTable = new ObservableCollection<MyGridData>();
MyGridTable.Add(MyGridData); //more then 2 datas
}
推 MyGridTable 2 或更多 MyGridData 以查找 MyGridData 找到的選定行。 然后,xaml 端
<!--abstract... your GridData tag -->
<DataGrid SelectedItem="{Binding MyData}" ItemSource="{Binding MyGridTable}"/>
<!--And put Trigger Code ABOVE Reply-->
Lanch App 並雙擊DataGrid,然后可以在MyGridTable 選中的Row 中找到Correspond MyData。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.