绑定样式中的命令

时间:2012-02-28 20:50:55

标签: wpf binding mvvm command

我目前正在开发一个使用MVVM的WPF应用程序。我有一个ListBox,其样式设置使其像RadioButtonList一样显示如下:

<Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="{x:Null}" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Border Background="Transparent">
                                <RadioButton Focusable="False" IsHitTestVisible="False" IsChecked="{TemplateBinding IsSelected}" Content="{Binding Path=DisplayName}" Command="{Binding ElementName=ShippingWindow, Path=DataContext.ShipOtherMethodSelected}">
                                </RadioButton>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

<ListBox Name="lbShipOtherMethodOptions" Style="{StaticResource RadioButtonList}" ItemsSource="{Binding Path=ShipOtherMethodOptions}" Margin="13,74,366,282" />

我正在尝试将命令绑定到RadioButton,以便在进行选择时可以触发事件。我在我的viewmodel中有以下代码,但我似乎无法解决它:

    private ICommand shipOtherMethodSelected;
    public ICommand ShipOtherMethodSelected
    {
        get
        {
            return shipOtherMethodSelected ??
                   (shipOtherMethodSelected = new RelayCommand(param => ShipOpenItems(), param => true));
        }
    }

    private void ShipOpenItems()
    {
        MessageBox.Show("GOT HERE");
    }

我是WPF和MVVM的新手,所以我可能会遗漏一些明显的东西。有人能指出我正确的方向吗?

修改: 根据jberger的建议,我提出了一些我尝试过的代码无效。在该部分中设置断点不会被触发,消息框也不会显示。

编辑2: 因此,在检查发送方的DataContext之后,事实证明它指向了我将RadioButton绑定到的对象,而不是我的viewmodel。我更新了上面的代码(在我的窗口中添加x:Name并更新了Command绑定),现在我在最初绑定时触发事件,但是当我选择一个值时它不会触发。好像我们现在变得非常接近。

1 个答案:

答案 0 :(得分:4)

ShipOtherMethodSelected位于您的(主要)ShippingVM而不是您的ShipItemVM,因此您需要设置

Command="{Binding ElementName=ShippingWindow, Path=DataContext.ShipOtherMethodSelected}"

其中ShippingWindowx:Name

上方元素的ListBoxItem

此外,Focusable="False" IsHitTestVisible="False"拒绝点击。删除二传手。