gpt4 book ai didi

c# - 子执行命令后调用方法

转载 作者:行者123 更新时间:2023-12-03 10:36:11 24 4
gpt4 key购买 nike

我目前正在学习如何在 C#/WPF 项目中实现命令。假设我有一个类(class) MyClass用一个简单的命令MyCommand .

public class MyClass
{
private RelayCommand _myCommand;
public ICommand MyCommand
{
get
{
if (_myCommand == null)
_myCommand = new RelayCommand(_ => ExecuteMyCommand());
return _myCommand;
}
}

private void ExecuteMyCommand()
{
// Do work...
}
}

现在,假设我创建了一个 ObservableCollection<MyClass>在绑定(bind)到 ListView 的 View 模型中。 ListView 有一个 GridViewColumn,其中的按钮绑定(bind)到 MyCommand。一切都很好。
public class MyViewModel
{
private ObservableCollection<MyClass> _myCollection;
public ObservableCollection<MyClass> MyCollection
{
get { return _myCollection; }
set
{
_myCollection = value;
RaisePropertyChanged("MyCollection");
}
}

public void Refresh()
{
// Do work to refresh MyCollection to it's "live" state
}
}

现在我需要在 MyCollection 中的一个对象执行 MyCommand 后调用 View 模型上的 Refresh() 方法,但我不确定如何处理这种情况。

我尝试过的事情:
  • 在 MyClass 的构造过程中添加对 View 模型的引用,允许命令在执行命令时通过 View 模型的引用调用 Refresh()。这很好用,但我真的不喜欢这段代码——让它引用一个特定的 View 模型感觉很乱,尤其是在程序的其他部分使用它时。

  • 我考虑过的事情:
  • 将 Refresh() 更改为 ObservableCollection<MyClass> 的扩展方法,像前面提到的那样添加一个引用属性,但是引用 ObservableCollection 而不是 View 模型,这不会让人觉得很困惑,但在我看来仍然不是很完美...

  • 解决此问题的最佳/正确方法是什么?

    最佳答案

    另一种打开此功能的方法如下:

    <MenuItem Content="Run MyCommand"
    Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.RefreshCommand}"
    CommandParameter="{Binding}"/>

    然后,在您的 MyViewModel
    public class MyViewModel
    {
    private ObservableCollection<MyClass> _myCollection;
    public ObservableCollection<MyClass> MyCollection
    {
    get { return _myCollection; }
    set
    {
    _myCollection = value;
    RaisePropertyChanged("MyCollection");
    }
    }

    //...

    private ICommand _refreshCommand;
    public ICommand RefreshCommand
    {
    get
    {
    if (_refreshCommand== null)
    _refreshCommand= new RelayCommand<MyClass>(p => Refresh(p));
    return _refreshCommand;
    }
    }

    public void Refresh(MyClass parameter)
    {
    if (null == parameter)
    return;
    parameter.ExecuteMyCommand();
    // Do work to refresh MyCollection to it's "live" state
    }
    }

    注意:目前您不需要拥有 MyCommand在每个 MyClass实例 - 您可以将其作为参数传递给父 View 模型。

    我不能说有正确的方法来完成你的任务。所以我不能说哪个更好。

    关于c# - 子执行命令后调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27497313/

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