我可以将整个UI元素传递给IValueConverter吗?

时间:2011-06-14 21:28:08

标签: c# wpf xaml data-binding ivalueconverter

<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个元素并进行比较,然后返回红色或绿色。这可以吗?

否则我想我必须遍历视觉树,这就像我想的那样丑陋

2 个答案:

答案 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进行比较,并相应地返回InputtedAddressBrushes.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提供的示例非常容易。