Могу ли я передать весь элемент пользовательского интерфейса в IValueConverter? - PullRequest
0 голосов
/ 15 июня 2011
<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 в преобразователь данных, получить его Parent StackPanel, получить дочерний элемент 0, привести к Combobox, получить 0-й элемент и сравнить, а затем вернуть красный или зеленый. Это выполнимо?

В противном случае я думаю, что мне нужно пройти по визуальному дереву, которое, как мне кажется, столь же уродливо

Ответы [ 2 ]

2 голосов
/ 15 июня 2011
<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 статьи

1 голос
/ 15 июня 2011

Вы можете привязать к SelectedItem из 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 для преобразования двух входящих значений в Brush. Это действительно легко сделать на примере документация .

...