gpt4 book ai didi

c# - WPF MVVM 根据焦点项目执行不同的操作

转载 作者:行者123 更新时间:2023-11-30 18:25:56 24 4
gpt4 key购买 nike

我正在 MVVM Patern 中开发 WPF 应用程序。该应用程序有一个命令栏和用于保存和删除记录的按钮。

enter image description here

该应用程序还有一个主从表单。它是一个用户控件和一个数据网格。

  • 主 block :客户订单

  • 详细信息 block :客户订单行

    (一对多关系)。

问题:

单击命令栏中的按钮时,需要根据焦点项目执行不同的操作。

举个例子,如果我点击删除按钮

  1. 应该只删除DataGrid行中的记录,当DataGrid有选择焦点和行。例如。应调用 DeleteRows() 方法。

  2. 如果主 block 有焦点而不是数据网格,它应该删除整个记录。例如。应调用 DeleteRecord() 方法。

据我所知,我可以使用键盘焦点和逻辑焦点管理器来实现这一点。但是我无法找到合适的解决方案。我应该考虑的是,当单击删除按钮时,我应该忽略删除按钮的焦点。

请用示例代码帮助我解决这个问题。

最佳答案

由于您使用的是 MVVM 模式,我假设命令栏中的按钮在 View 模型中具有相应的 ICommand

您可以将 DataGridSelectedItem 属性绑定(bind)到 View 模型属性(当然,使用双向绑定(bind))并根据该属性做出决定值(value)。如果为null,则DataGrid中当前没有被选中的项,可以删除整条记录。如果设置为一个实例,则在 DataGrid 中选择一行,您只能删除一行。

如果您需要确切知道最后获得焦点的元素是哪个,您可以使用 Keyboard.PreviewLostKeyboardFocus在您的代码后面附加事件。或者更好的是,创建您自己的 Behavior,并带有可以绑定(bind)到 View 模型的依赖属性。

enum LastFocusedEntityType { None, Record, Row }

class LastFocusedEntityTrackingBehavior : Behavior<UIElement>
{
public static readonly LastFocusedEntityProperty = DependencyProperty.Register(
"LastFocusedEntity",
typeof(LastFocusedEntityType),
typeof(LastFocusedEntityTrackingBehavior),
LastFocusedEntityType.None);

public LastFocusedEntityType LastFocusedEntity
{
get { return (LastFocusedEntityType)this.GetValue(LastFocusedEntityProperty); }
set { this.Setvalue(LastFocusedEntityProperty, value); }
}

protected override void OnAttached()
{
Keyboard.AddPreviewLostKeyboardFocusHandler(this.AssociatedObject, this.PreviewLostKeyboardFocusHandler);
}

private void PreviewLostKeyboardFocusHandler(object sender, KeyboardFocusChangedEventArgs e)
{
if (e.OldFocus is DataGrid)
{
this.LastFocusedEntity = LastFocusedEntityType.Row;
}
else
{
this.LastFocusedEntity = LastFocusedEntityType.Record;
}
}
}

然后您可以将此行为应用于您的主 block 容器:

<UserControl>
<i:Interaction.Behaviors>
<local:LastFocusedEntityTrackingBehavior LastFocusedEntity="{Binding LastFocusedEntity, Mode=OneWayToSource}"/>
</i:Interaction.Behaviors>
</UserControl>

在您的 View 模型中,您的 ICommandExecute() 方法应该查看 LastFocusedEntity 属性值并决定要做什么接下来。

注意:我没有检查这段代码是否编译。

关于c# - WPF MVVM 根据焦点项目执行不同的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29331365/

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