0

我有一个 WPF/MVVM 应用程序,ListBox它通过DataTemplate. 我设法ListBox在按下按钮时更改了所选项目,因此CommandParameter链接到ListBox's SelectedItem,但我无法以相同的方式正确启用/禁用按钮。例如,如果我有 2 个项目并且按钮应该在一个中启用而在另一个中禁用,当我选择一个元素时,两个按钮具有相同的状态,并且当我选择另一个项目时它们都会改变状态。

我正在使用RelayCommand许多 MVVM 框架中使用的 a。

这是我的 XAML(删除了“不感兴趣”的部分):

<UserControl.Resources>

    <DataTemplate x:Key="ItemTemplate">
            <Grid>
                <Button Content="Something" Name="EnabledDisabledButton" Click="Button_Click"
                            Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.SomeCommand}"
                            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=SelectedItem}"/>
            </Grid>
    </DataTemplate>


    <Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
        <Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
    </Style>

</UserControl.Resources>

   <ListBox x:Name="myListBox" ItemsSource="{Binding ElementList}"
             IsSynchronizedWithCurrentItem="True" ItemContainerStyle="{StaticResource ContainerStyle}"/>

我试图将'SelectedItem作为参数传递给RelayCommand'CanExecute方法,但结果和以前一样。

有没有办法将ListBoxItem按钮“居住”的实际值作为参数传递给命令,因此每个都将由该CanExecute方法单独处理?如果我得到了它会起作用吗?(现在我正在处理Click事件以在执行命令之前在列表中选择正确的项目)。

在我的CanExecute方法中,我正在评估 的某些属性SelectedItem以启用/禁用相应的按钮。另一种方法是评估所有元素的此属性,但我想不出在 内部执行此操作的方法ViewModel,然后将结果传达给视图(如果DataTemplate在项目中使用 a 时甚至可能的话)。

感谢您的输入,问候!

4

2 回答 2

1

您在问题中提到了“MVVM”,但您似乎充分利用了 MVVM 方式。

我根本不会在样式中有 Button_Click 事件。那是因为它实际上是一种样式,根据定义可以将其更改为不具有相同事件的另一种样式,如果您将来选择基于样式的应用程序,这将再次使应用程序停止工作. 我使用的规则是风格就是风格。样式与应用程序的 UI 和“外观”有关。功能应该与 UI 分开。程序员可以定义命令,设计者可以决定用户如何以最佳方式使用它。

这正是从 MVVM 模式中分离代码的地方。将“外观”和用户行为与应用程序的逻辑分开。就像...如果命令从按钮、菜单、数据上下文或击键触发,模型应该无关紧要。

如果这个特殊问题由我处理,我会通过拥有一个 HOLDER 类来解决它。这是一个类(实现 INotifyPropertyChanged 的​​ DependencyObject),它包含一个 ICommand 属性以及将显示在 ListBox 的各个行中的“行”。

ICommand 属性将绑定到 Button,将行(类)本身作为调用的 CommandParameter。然后将在 ListBox 上的 ItemTemplate 中使用实际行,并绑定到不同的元素(带有或不带有转换器的属性)以使任何所需的显示可用。

我希望我解释得足够好......如果您想要我的解决方案替代方案的更多详细信息,请随时询问更多信息。

于 2012-12-26T22:47:48.480 回答
1

将我的评论转换为答案:

为什么不只是CommandParameter="{Binding}"

于 2012-12-27T01:36:03.417 回答