我見過其他問題非常相似,但不知何故,我仍然無法得到它的工作。這是場景。綁定RadioButton IsChecked到ListBoxItem IsSelected和ListBox IsFocused
我有什麼 我有一個ListBox
顯示我的視圖模型的列表。每個視圖模型都有一個顯示在另一個嵌套列表框中的子項列表。我正在使用DataTemplate
來實現此目的。
我想要的東西 我想孩子們的項目有選擇ListBoxItem
時選擇一個RadioButton
當ListBox
具有焦點(內部ListBox
)。
目前,上述IsSelected
部分工作得很好,但是當我從一個視圖模型移動到另一個視圖模型時(即第一個ListBox失去焦點),第一個ListBox
上的單選按鈕仍保持選中狀態。
下面是代碼:
<Style TargetType="{x:Type ListBox}">
<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}">
<RadioButton Focusable="False">
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" Value="False">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
<RadioButton.IsChecked>
<Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}" />
</RadioButton.IsChecked>
<ContentPresenter></ContentPresenter>
</RadioButton>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
我也曾嘗試MultiBinding
,但wasnt工作要麼。有什麼建議麼?
UPDATE 更新,包括我在MultiBinding
嘗試:
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<RadioButton>
<RadioButton.IsChecked>
<MultiBinding>
<MultiBinding.Converter>
<DataExportTool:AllTrueConverter/>
</MultiBinding.Converter>
<Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="IsFocused" Mode="OneWay" RelativeSource="{RelativeSource TemplatedParent}"/>
</MultiBinding>
</RadioButton.IsChecked>
<ContentPresenter/>
</RadioButton>
</ControlTemplate>
和轉換器:
public class AllTrueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Cast<bool>().All(x => x);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return Enumerable.Repeat((bool)value, 2).Cast<object>().ToArray();
}
}
這樣做的IsSelected
部分的偉大工程,即只有在列表中的一個項目都有隨時選擇的單選按鈕。但是,當控制失去焦點時,所選項目的單選按鈕仍處於選中狀態(不是我想要的)。
對不起,我讀過你試過MultiBinding AFTER回答。你介意解釋你是如何做到的? – Carlo 2009-08-28 22:15:38