簡體   English   中英

WPF Datagrid 雙擊單元格 MVVM 設計

[英]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);
            }
        }
    }

當你雙擊一個數據網格時,該行也被選中,所以我只是找到選中的項目並使用它。

假設

  1. 作為 MyGridDataList 的 DataGrid
  2. 選定行的 Griddata 作為 MyGridData
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM