2009-08-28 123 views
2

我見過其他問題非常相似,但不知何故,我仍然無法得到它的工作。這是場景。綁定RadioButton IsChecked到ListBoxItem IsSelected和ListBox IsFocused

我有什麼 我有一個ListBox顯示我的視圖模型的列表。每個視圖模型都有一個顯示在另一個嵌套列表框中的子項列表。我正在使用DataTemplate來實現此目的。

我想要的東西 我想孩子們的項目有選擇ListBoxItem時選擇一個RadioButtonListBox具有焦點(內部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部分的偉大工程,即只有在列表中的一個項目都有隨時選擇的單選按鈕。但是,當控制失去焦點時,所選項目的單選按鈕仍處於選中狀態(不是我想要的)。

+0

對不起,我讀過你試過MultiBinding AFTER回答。你介意解釋你是如何做到的? – Carlo 2009-08-28 22:15:38

回答

2

這是最終工作的xaml。禁用單選按鈕似乎是這裏的關鍵。

看着默認模板很有幫助。

1

使用MultiBinding而不是常規的綁定,您還需要在這裏的IMultiValueConverter:

<RadioButton.IsChecked> 
    <Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}" /> 
</RadioButton.IsChecked> 

我通常做我自己的例子,但this link應該給你如何使用它們是一個好主意。如果不是,我會稍後做一個簡單的例子。

基本上你想要做的是在MultiBinding同時發送IsFocused和IsSelected依賴項屬性,然後在MultiValueConverter這樣說

return (bool)value[0] && (bool)value[1]; 

當值IsFocused和價值1是IsSelected或副[0]反之亦然。

祝你好運!

相關問題