我目前正在开发一个使用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绑定),现在我在最初绑定时触发事件,但是当我选择一个值时它不会触发。好像我们现在变得非常接近。
答案 0 :(得分:4)
ShipOtherMethodSelected
位于您的(主要)ShippingVM
而不是您的ShipItemVM
,因此您需要设置
Command="{Binding ElementName=ShippingWindow, Path=DataContext.ShipOtherMethodSelected}"
其中ShippingWindow
是x:Name
ListBoxItem
此外,Focusable="False" IsHitTestVisible="False"
拒绝点击。删除二传手。