我正在开发一个 WPF 项目,并且正在尝试遵循 MVVM 模式。过去我只使用 DataTemplates 来显示信息,但现在我想在我的模板上放置一个按钮,该按钮执行与包含单击按钮的项目相关的操作。我试图找出将我的代码绑定(bind)到我的按钮的最佳方法,以使代码知道单击了哪个按钮。
我的 WindowViewModel
包含通过命令属性公开的中继命令,以及 ObservableCollection
的“项目”。
public class WindowViewModel
{
public ICommand ChangeItemCommand { get; private set; }
public ObservableCollection<Item> Items {get;private set;}
public WindowViewModel()
{
ChangeItemCommand = new RelayCommand(new Action<object>(this.ChangeItem));
Items = new ObservableCollection<Item>();
}
public void ChangeItem(object o)
{
string key = (string)o;
//do something to the item with provided key
}
}
我的
ItemViewModel
包含 ItemKey
属性来识别项目。public class ItemViewModel
{
public string ItemName { get; private set; }
public string ItemKey { get; private set; }
}
我的列表框 DataTemplate 看起来像这样。
<DataTemplate DataType="local:ItemViewModel">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding ItemName}"/>
<Button Command="???" CommandParameter="{Binding ItemKey}"/>
</StackPanel>
</DataTemplate>
所以我试图找出将按钮命令绑定(bind)到
WindowViewModel.ChangeItemCommand
的最佳方法。的WindowViewModel
.我正在考虑的一种选择是将命令属性添加到
ItemViewModel
由 WindowViewModel
创建实例时设置public class ItemViewModel
{
public string ItemName { get; private set; }
public string ItemKey { get; private set; }
public ICommand ChangeItemCommand{ get; private set; }
}
<Button Command="{Binding ChangeItemCommand}" CommandParameter="{Binding ItemKey}"/>
或者,我可以直接绑定(bind)到
WindowViewModel.ChangeItemCommand
使用 RelativeSource
的属性.<Button
Command="{Binding Path=ChangeItemCommand,
RelativeSource={RelativeSource AncestorType={x:Type MyAppAWindow}}}"
CommandParameter="{Binding ItemKey}"/>
注意:我不完全确定我做对了
那么推荐哪个,或者有其他更好的方法吗?
最佳答案
这两个选项都很好,但真正要做出的决定是谁应该是这个 Action 的所有者,在 MVVM 中应该首先设计 View 模型,然后 View 应该正确使用它们。
例如
WindowViewModel
(因为这是关于更改 WindowViewModel
公开的集合)。 RefreshItemData
或 ChangeItemDetails
(例如 ItemName
或 ItemStatus
)那么它属于 ItemViewModel
(因为这个 ItemViewModel
可以在支持此操作的其他窗口中使用)因此,我建议您首先考虑功能、可重用性等来设计 ViewModel,然后使用合适的绑定(bind)功能(即
RelativeSource
、ElementName
、直接等)。
关于c# - WPF 命令绑定(bind)到带有 MVVM 的 DataItemTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693657/