在下面的xaml代码中,我正在尝试绑定视图模型中的RelayCommand ResourceButtonClick
。除此之外,我想将Resource.Id
作为参数传递给此命令。
但是,ResourceButtonClick
未被调用。我怀疑通过将ItemsSource
设置为Resources
,我会覆盖数据上下文,即视图模型。
<UserControl ...>
<Grid>
<ItemsControl ItemsSource="{Binding Resources}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Tag="{Binding Id}" Content="{Binding Content}"
Width="300" Height="50"
Command="{Binding ResourceButtonClick}"
CommandParameter="{Binding Id}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>
以下是视图模型中的RelayCommand
。
public RelayCommand<int> ResourceButtonClick { get; private set; }
视图模型的构造函数:
public ResourcesViewModel()
{
this.ResourceButtonClick =
new RelayCommand<int>((e) => this.OnResourceButtonClick(e));
}
视图模型中的方法:
private void OnResourceButtonClick(int suggestionId)
{
...
}
我有两个问题:首先,我如何调用ResourceButtonClick
命令。其次,如何将Resource.Id
作为参数传递给该命令。
任何建议都将受到赞赏。
答案 0 :(得分:2)
也许您可以展示完整的ViewModel类?假设 ResourceButtonClick 命令位于ViewModel上,该命令还包含集合 Resources ,您试图访问错误对象上的命令(在资源,而不是包含 Resources 集合和命令的ViewModel。
因此你必须访问'other'DataContext上的命令,这是ItemsControl的DataContext,而不是它的项目。最简单的方法是使用绑定的 ElementName 属性:
<UserControl ...>
<Grid>
<ItemsControl ItemsSource="{Binding Resources}" Name="ResourcesItemsControl">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Tag="{Binding Id}" Content="{Binding Content}"
Width="300" Height="50"
Command="{Binding DataContext.ResourceButtonClick, ElementName=ResourcesItemsControl}"
CommandParameter="{Binding Id}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</UserControl>
也许这可以解决问题,否则请告诉我并提供更多细节。
我通常将整个项目作为CommandParameter传递,而不是ID。这不需要任何费用,您不必将ID转换回项目。但这取决于你的情况。
希望这有帮助。
答案 1 :(得分:0)
我以这样的方式解决了这个问题: 在View.xaml中
1)我为ListView添加了一个属性SelectedItem:
<ListView Name="MyList" ItemsSource="{Binding MyList}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" >
2)我在按钮中添加了一个Command属性:
在viewModel中: 3)我添加了一个命令处理程序:
MyCommand = new RelayCommand(MyMethod);
4)我添加了MyMethod方法,该方法从MySelectedItem属性获取值:
private void MyMethod ()
{
MyType mt = MySelectedItem;
//now you have access to all properties of your item via mt object
}