我的约束力:
祖先的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"));
}
}
}
项目绑定到Peers集合,每个文本块绑定到当前Peer的名称。
我遇到的问题是我需要将每个Button(项)绑定到客户端中的其他属性 “InConversation”除了收集中的当前Peer外。
如何完成这样的绑定?
答案 0 :(得分:1)
有多种解决方案,一种是使用RelativeSource绑定:
<DataTemplate x:Key="PlayersItemsControlTemplate" >
<Button Content="{Binding Name}"
IsEnabled="{Binding Path=DataContext.InConversation,
RelativeSource={RelativeSource AncestorType=ItemsControl}}"></Button>
</DataTemplate>
当然,只有在DataTemplate
内使用ItemsControl
时,它才有效。
一种更好的方法是使用所谓的DataContextSpy
(info和more info)直接绑定到另一个控件的DataContext
。