stringformat c# wpf xaml data-binding ivalueconverter

c# - stringformat - textbox string format wpf



¿Puedo pasar todo el elemento UI a un IValueConverter? (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={Hopefully pass the UI element to the dataconverter } /> </StackPanel> </DataTemplate>

ComboBox tiene direcciones que coinciden desde una geodatabase con el valor de puntuación más alto seleccionado. Textblock tiene la dirección ingresada por el usuario que se usó para hacer coincidir. Si la dirección es la misma, quiero que el primer plano sea Verde, de lo contrario Rojo.

Pensé que tal vez podría pasar todo el TextBlock al convertidor de datos, obtener su Parent StackPanel, obtener el hijo 0, convertirlo a un Combobox obtener el elemento 0 y compararlo, y luego volver a rojo o verde. ¿Es esto factible?

De lo contrario, creo que tengo que atravesar el árbol visual, que es tan feo, creo


Puede enlazar al elemento SelectedItem del ComboBox utilizando un convertidor que compare su valor de igualdad con el de InputtedAddress y devuelve Brushes.Green o Brushes.Red correspondientemente.

La parte difícil es que el convertidor mencionado anteriormente necesitaría realizar un seguimiento de InputtedAdress alguna manera; esto es bastante engorroso porque no podemos usar ConverterParameter para enlazar, por lo que necesitaríamos un convertidor algo complicado.

Por otro lado, el efecto se puede implementar más fácilmente con un IMultiValueConverter . Por ejemplo:

<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>

Entonces necesitaría un IMultiValueConverter para convertir los dos valores entrantes en un Brush . Esto es realmente fácil de hacer usando el ejemplo proporcionado por la documentación .


<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>

Sí. Ver artículo msdn