<DataTemplate>
<StackPanel Orientation="Vertical" Name="AddressStackPanel" >
<ComboBox Name="ComboBox" ItemsSource="{Binding Path=MatchedAddressList}" DisplayMemberPath="Address" SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged"/>
<TextBlock Name="InputtedAddress" Text="{Binding Path=InputtedAddress}" Foreground={Hopefully pass the UI element to the dataconverter } />
</StackPanel>
</DataTemplate>
ComboBox的地址与选定得分最高的地理数据库匹配。 Textblock具有用于用于匹配的用户输入地址。如果地址相同,我希望前景为绿色,否则为红色。
我想也许我可以将整个TextBlock传递到dataconverter,获取其父StackPanel,获取子0,转换为Combobox获取第0个元素并进行比较,然后返回红色或绿色。这可以吗?
否则我想我必须遍历视觉树,这就像我想的那样丑陋
答案 0 :(得分:2)
<DataTemplate>
<StackPanel Orientation="Vertical" Name="AddressStackPanel" >
<ComboBox Name="ComboBox"
ItemsSource="{Binding Path=MatchedAddressList}"
DisplayMemberPath="Address" SelectedIndex="0"
SelectionChanged="ComboBox_SelectionChanged"/>
<TextBlock Name="InputtedAddress" Text="{Binding Path=InputtedAddress}"
Foreground={"Binding RelativeSource={x:Static RelativeSource.Self},
Converter={x:StaticResource myConverter}}" />
</StackPanel>
</DataTemplate>
是。见msdn article
答案 1 :(得分:1)
您可以使用转换器绑定SelectedItem
的{{1}},该转换器将其相等值与ComboBox
进行比较,并相应地返回InputtedAddress
或Brushes.Green
棘手的部分是上面提到的转换器需要以某种方式跟踪Brushes.Red
;这非常麻烦,因为我们不能使用InputtedAdress
来绑定,所以我们需要一个有点参与的转换器。
另一方面,使用ConverterParameter
可以更轻松地实现效果。例如:
IMultiValueConverter
然后,您需要<ComboBox Name="ComboBox" ItemsSource="{Binding Path=MatchedAddressList}" DisplayMemberPath="Address" SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged"/>
<TextBlock Name="InputtedAddress" Text="{Binding Path=InputtedAddress}">
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource equalityToBrushConverter}">
<Binding ElementName="ComboBox" Path="SelectedItem" />
<Binding Path="InputtedAddress" />
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
将两个传入值转换为IMultiValueConverter
。使用documentation提供的示例非常容易。