设置DataContext以在xaml中绑定RelayCommand

时间:2013-03-05 13:18:47

标签: silverlight xaml mvvm mvvm-light relaycommand

在下面的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作为参数传递给该命令。

任何建议都将受到赞赏。

2 个答案:

答案 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
        }