c# - ICommand接口(interface)的高效使用

标签 c# wpf mvvm xamarin

我正在开始一个使用 Xamarin Forms 进行移动应用程序跨平台开发的项目。我正在使用 MVVM 模型,除了几个小型 WPF 应用程序之外,我对它几乎没有经验。

我使用 ICommand 接口(interface)在 View 的 XAML 中创建命令并绑定(bind)到它们,默认情况下这涉及大量重复代码。 Xamarin.Forms 提供了 ICommand 的具体子类型 Command,它在讨论中使用 here ,我看到了两种显而易见的方法来实例化它们。

选项 #1 - 在构造函数中分配命令。

public class Presenter : ObservableObject
{
    public Presenter()
    {
        DoStuffCommand = new Command(DoStuff);
    }

    public ICommand DoStuffCommand { get; set; }

    private void DoStuff()
    {
        // VM stuff
    }

}

选项 #2 - 在 getter 中实例化命令

public class Presenter : ObservableObject
{
    public ICommand RunCommand { get { return new Command(DoStuff); } }

    private void DoStuff()
    {
        // VM stuff
    }

}

许多 View 模型将有许多命令,而方法 #2 避免在构造函数中将所有这些一一分配 - 当命令操作不会改变时,我更清楚地声明此操作ICommand 本身。另一方面,这将在每次命令触发时创建一个新的 Command 实例,这在内存方面显然不如方法 #1 有效。

有没有人有这方面的经验,和/或可以告诉我这是否会显着影响性能?有没有办法对此进行改进,例如手动销毁 Command 对象?

谢谢!

最佳答案

选项 #2 的替代方法是为它提供一个支持字段并确保它只实例化一次:

private ICommand _doStuffCommand;
public ICommand DoStuffCommand =>
    _doStuffCommand = _doStuffCommand ?? new Command(DoStuff);

private void DoStuff()
{

}

关于c# - ICommand接口(interface)的高效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838002/

相关文章:

c# - CanExecute RelayCommand MVVM Light 5+ 上的奇怪行为

c# - IShellItemImageFactory Icon\Thumbnails 不同于 Windows 7 桌面

silverlight - 如何从 silverlight 中的 View 模型从一个 View 导航到另一个 View ?

c# - MVVM - IsEnabled 无法与绑定(bind) bool 值一起正常工作

wpf - 如何检测 WPF DataGrid 行数据已更改?

C#http Post在webresponse中没有得到任何东西

c# - 如何避免 EF Core 2.1 中的 n+1 查询?

c# - 线程是在 C# 用户级还是内核级创建的?

wpf - 如何将自定义数据与 CollectionViewGroup 关联?

wpf - SSH.NET 实时命令输出监控