gpt4 book ai didi

c# - MVVM 是模型中的命令是一种不好的做法吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:51 24 4
gpt4 key购买 nike

我想知道,将命令放入模型中是否是 MVVM 中的不良做法。例如,我有带有 ImageButtonListBox。当我点击 Button 时,我需要在浏览器中打开 url。因此,我的代码将如下所示:

<ListBox ItemSource="{Binding Items">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source={Binding ImageSource} />
<Button Content="Open url" Command={Binding OpenUrlCommand}"/>
</StackPanel>
</DataTemplate>
</Listbox.ItemTemplate>
</ListBox>

View 模型:

class MainViewModel:BaseViewModel
{
public ObservableCollection<Model> Items {get;set;}
}

型号:

class Model
{
public string ImageSource {get;set;}

public string Url {get;set;}

public ICommand OpenUrlCommand {get;set;}

public Model()
{
OpenUrlCommand = new RelayCommand(openUrl);
}

public void openUrl()
{
Process.Start(Url); //Open url in browser
}
}

可以吗,还是我应该将 OpenUrlCommand 移动到 MainViewModel

最佳答案

您实际上应该在模型中实现方法,但在 View 模型中实现命令。这将更加符合 MVVM 架构,并且在这种情况下对您来说根本不需要额外的工作。

在您的 ViewModel 中:

class MainViewModel : BaseViewModel
{
private Model _model;

ICommand OpenUrlCommand { get { return new RelayCommand(_model.openUrl); } }

// ...
}

如果你想从 View 中“发送”一些 URL,你可以使用 CommandParameter为此,输入 RelayCommand .

更新:请注意,由于命令绑定(bind)所在的 DataTemplate 是 ItemTemplate,因此您应该在某些 ItemViewModel 中实现命令, 不在 MainViewModel .然后,制作Items一个ObservableCollection<ItemViewModel>而不是 ObservableCollection<Model> ,并像这样初始化集合:

IEnumerable<Model> models= getSomeModelsToStartWith();
var Items = new ObservableCollection<ItemViewModel>(models.Select(m => new ItemViewModel(m));

关于c# - MVVM 是模型中的命令是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653239/

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