2015-05-27 54 views
0

我的問題與以下代碼綁定MyListBoxItem類的IsAvailable屬性。我目前的解決方案:ListBoxItem模板內的控件風格的相對綁定

<ListBox ItemTemplate="{StaticResource myTemplate}"> 
    <ListBox.Resources> 
    <DataTemplate x:Key="myTemplate" DataType="{x:Type local:MyListBoxItem}"> 
     <Label Foreground="Green" Content="{Binding Title}" Tag="{Binding IsAvailable}"> 
     <Label.Style> 
      <Style TargetType="{x:Type Label}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True"> 
       <Setter Property="FontWeight" Value="Bold"/> 
       </DataTrigger> 
      </Style.Triggers> 
      </Style> 
     </Label.Style> 
     </Label> 
    </DataTemplate> 
    ... (more datatemplates) 

    </ListBox.Resources> 
</ListBox> 

我的問題:在我的解決方案的IsAvailable值「經過」兩個綁定。第一個將值綁定到LabelTag屬性,然後在樣式觸發器中,觸發器檢查其值並設置Label的屬性。當我使用Binding="{Binding IsAvailable, RelativeSource={RelativeSource AncestorType={x:Type local:MyListBoxItem}}}"時,它不起作用,因爲Style無法看到Label(或類似原因)的任何祖先,所以導致綁定錯誤(代碼爲4或40),對於添加到ListBox的每個項目。

所以最後:我可以讓解決方案更簡單,還是沒有其他(更好)的解決方案?

我忘了提一個重要的事情,對不起:我把ListBox的資源DataTemplate,因爲我有更多的模板(他們基本上是不同的,所以我不能用觸發器他們的風格),我有時需要切換...

回答

0

ItemTemplate將採用ItemsSource所綁定的類型。因此,您應該能夠簡單地綁定到IsAvailable,因爲列表框的項目類型是MyListBoxItem。試試這個:

<ListBox ItemsSource="..."> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Label Foreground="Green" Content="{Binding Title}" Tag="{Binding IsAvailable}"> 
        <Label.Style> 
         <Style TargetType="{x:Type Label}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True"> 
            <Setter Property="FontWeight" Value="Bold"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Label.Style> 
       </Label> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

你需要你的ItemsSource屬性設置爲BindingMyListBoxItem集合。