2012-11-26 58 views
0

我需要做一些類似於PriorityBinding的操作,不同之處在於當綁定爲null時(而不是在綁定無效時,像在PriorityBinding中那樣)時使用較低優先級綁定。我似乎無法找到一種'好'的方法來做到這一點,但是並沒有創建兩個重複的控件,一個是我想要使用的每個綁定,另一個是基於綁定是否爲null來觸發它們的可見性。必須有更好的方法,因爲我不想在每次需要更改某些內容時更新兩個控件(重複代碼==不好)。當綁定值爲null時綁定到不同的屬性路徑

例子:

時SelectedItem.SelectedItem不爲空:

<ContentControl Content="{Binding SelectedItem.SelectedItem}"/> 

當SelectedItem.SelectedItem爲空:

<ContentControl Content="{Binding SelectedItem}"/> 

使用樣式像這樣沒有工作:

<ContentControl Content="{Binding SelectedItem.SelectedItem}"> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedItem.SelectedItem}" Value="{x:Null}"> 
        <Setter Property="Content" Value="{Binding SelectedItem}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

我猜這不起作用,因爲樣式中的綁定試圖使用ContentControl的Content屬性作爲其源,所以DataTrigger正在測試SelectedItem.SelectedItem.SelectedItem.SelectedItem。有任何想法嗎?

+0

你可以使用一個轉換器,並結合像CONTENT =「{結合的SelectedItem,... }」。在轉換器中你檢查SelectedItem.SelectedItem - 屬性:if null返回SelectedItem,否則返回SelectedItem.SelectedItem –

+0

如果你在轉換器中這樣做,我不認爲它會捕獲屬性更改,綁定如何知道SelectedItem。 SelectedItem已更改? –

+1

使用MultiBinding;) –

回答

3

您可以使用MultiBinding才達到你想要什麼:

<ContentControl Content="{Binding SelectedItem.SelectedItem}"> 
    <ContentControl.Content> 
     <MultiBinding Converter="{StaticResource ResourceKey=myConverter}"> 
      <Binding Path="SelectedItem"/> 
      <Binding Path="SelectedItem.SelectedItem"/> 
     </MultiBinding> 
    </ContentControl.Content> 
</ContentControl> 

你的轉換可能看起來像

public class MyMultiConverter:IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values[1] == null) 
      return values[0]; 

     return values[1]; 
    } 

    public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
}