gpt4 book ai didi

wpf - 为数据网格行创建上下文菜单

转载 作者:行者123 更新时间:2023-12-03 21:11:48 25 4
gpt4 key购买 nike

我有一个可能有很多行的数据网格。当用户右键单击其中一行时,我需要为每一行显示一个上下文菜单,并在用户单击该选项时执行一个操作(根据当前选定的行,相同的操作但不同的数据项)。

最好的策略是什么?

即使我正在使用 ContextMenuOpening 事件创建菜单,我也担心每一行的 ContextMenu 都是多余的,这有点像上下文菜单的“延迟加载”。我应该只对数据网格使用一个 ContextMenu 吗?但是有了这个,我将有更多关于点击事件的工作,以确定正确的行等。

最佳答案

据我所知,某些操作将根据行禁用或启用,因此单个 ContextMenu 没有任何意义对于 DataGrid .

我有一个行级上下文菜单的示例。

<UserControl.Resources>
<ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" Command="{Binding EditCommand}"/>
</ContextMenu>
<Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
</Style>
</UserControl.Resources>

<DataGrid RowStyle="{StaticResource DefaultRowStyle}"/>
DataGrid必须通过以下命令绑定(bind)到 View 模型列表:
public class ItemModel
{
public ItemModel()
{
this.EditCommand = new SimpleCommand
{
ExecuteDelegate = _ => MessageBox.Show("Execute"),
CanExecuteDelegate = _ => this.Id == 1
};
}
public int Id { get; set; }
public string Title { get; set; }
public ICommand EditCommand { get; set; }
}

上下文菜单在 UserControl 的资源集合中创建。而且我认为只有一个对象通过引用而不是值与数据网格行连接。

这是 ContextMenu 的另一个示例对于 CommandMainViewModel 内.我想 DataGrid具有正确的 View 模型 DataContext , CommandParameter 属性也必须放在 Command 属性之前:
    <ContextMenu  x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" CommandParameter="{Binding}"
Command="{Binding DataContext.DataGridActionCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
</ContextMenu>

楷模:
public class MainViewModel
{
public MainViewModel()
{
this.DataGridActionCommand = new DelegateCommand<ItemModel>(m => MessageBox.Show(m.Title), m => m != null && m.Id != 2);
}

public DelegateCommand<ItemModel> DataGridActionCommand { get; set; }
public List<ItemModel> Items { get; set; }
}

public class ItemModel
{
public int Id { get; set; }
public string Title { get; set; }
}

但是有一个问题是 MenuItem如果 CanExecute 则不显示为禁用项目返回假。可能的解决方法是使用 ParentModel ItemModel 内的属性,但它与第一​​个解决方案没有太大区别。
以下是上述解决方案的示例:
public class ItemModel
{
public int Id { get; set; }
public string Title { get; set; }
public MainViewModel ParentViewModel { get; set; }
}

//Somewhere in the code-behind, create the main view model
//and force child items to use this model as a parent model
var mainModel = new MainViewModel { Items = items.Select(item => new ItemViewModel(item, mainModel)).ToList()};

XAML 中的 MenuItem 会更简单:
<MenuItem Header="Edit" CommandParameter="{Binding}"
Command="{Binding ParentViewModel.DataGridActionCommand}" />

关于wpf - 为数据网格行创建上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com