2012-03-03 7 views
2

私はバインディング:は、異なるソースに複数のプロパティをバインド

祖先のDataContextの:

detailsPanel.DataContext = client 

のItemsControl:

<ItemsControl                 
      x:Name="PlayersItemsControl" 
      ItemsSource="{Binding Peers}" 
      ItemsPanel="{StaticResource PlayersItemsControlPanel}" 
      ItemTemplate="{StaticResource PlayersItemsControlTemplate}">      
    </ItemsControl>  

itemstemplate

 <DataTemplate x:Key="PlayersItemsControlTemplate" > 
     <Button Content="{Binding Name}" IsEnabled="{Binding InConversation,Converter={StaticResource MyStatusToButtonEnableConverter}}">             </Button> 
    </DataTemplate> 

項目ソース:

 public class Client : INotifyPropertyChanged 
     {         
      // the itemscontrol items source 
      private ObservableCollection<Player> peers; 
      public ObservableCollection<Player> Peers 
      { 
       get 
       { 
        if (peers == null) 
         peers = new ObservableCollection<Player>(); 
        return peers; 
       } 
      } 
      // the property i wan't to bind to IsEnabled Property of the Button 
      private bool inConversation; 
      public bool InConversation 
      { 
       get {return inConversation; } 
       set 
       { 
         inConversation = value; 
         if(PropertyChanged != null) 
          PropertyChanged(this,new PropertyChangedEventArgs("InConversation")); 
       } 
      } 
     } 

項目がピアコレクションにバインドされ、各テキストブロックは、現在のピアの名前にバインドされています。

問題は、私はクライアントの別のプロパティに各ボタン(アイテム)をバインドする必要があるということです。 コレクションの現在のピアに加えて、 "InConversation"。

どのようにこのように結合を行うことができますか?

答えて

1

複数のソリューションは、1つの結合RelativeSourceを使用することです、があります。もちろん

<DataTemplate x:Key="PlayersItemsControlTemplate" > 
<Button Content="{Binding Name}" 
     IsEnabled="{Binding Path=DataContext.InConversation, 
     RelativeSource={RelativeSource AncestorType=ItemsControl}}"></Button> 
</DataTemplate> 

をあなたのDataTemplateItemsControl内で使用する場合にのみ動作します。

より良い方法の1つは、別のコントロールのDataContextに直接バインドするために、いわゆるDataContextSpyinfomore info)を使用することです。