0

在下面的 xaml 代码中,我正在尝试绑定ResourceButtonClick视图模型中的 RelayCommand 。除此之外,我想将Resource.Id作为参数传递给这个命令。

但是,ResourceButtonClick不叫。我怀疑通过设置ItemsSourceto 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参数作为参数传递给该命令。

任何建议将不胜感激。

4

2 回答 2

2

也许你可以展示你完整的 ViewModel 类?假设ResourceButtonClick命令位于还包含集合Resources的 ViewModel 上,您试图访问错误对象上的命令(在Resources中的项目上,而不是包含Resources集合和命令的 ViewModel 上)。

因此,您必须访问“其他”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>

也许这可以解决问题,否则请告诉我并提供更多细节。

我通常将整个项目作为命令参数传递,而不是 ID。这不需要任何费用,您也不必将 ID 翻译回物品。但这取决于你的情况。

希望这可以帮助。

于 2013-03-05T13:46:48.153 回答
0

我以这样的方式解决了这个问题:在 View.xaml

1) 我为我的 ListView 添加了一个属性 SelectedItem:

<ListView Name="MyList" ItemsSource="{Binding MyList}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" >

2)我向按钮添加了一个命令属性:

在 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
        }
于 2013-04-02T12:52:54.130 回答