WPF Datatrigger non sparare quando previsto
-
01-07-2019 - |
Domanda
Ho il seguente codice XAML:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/>
<TextBlock Text="items selected">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="TextBlock.Text" Value="item selected"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Il primo blocco di testo felicemente modifiche con SelectedItems.Conte, mostrando 0,1,2, etc.Datatrigger sul secondo blocco non sembra a fuoco per modificare il testo.
Ogni pensiero?
Soluzione
DataTrigger è la cottura, ma il campo di Testo per il secondo blocco di Testo è codificato come "elementi selezionati" in modo da non essere in grado di cambiare.Per vedere la cottura, è possibile rimuovere Text="elementi selezionati".
Il tuo problema è un buon candidato per l'utilizzo di un ValueConverter invece di DataTrigger.Ecco come creare e utilizzare la ValueConverter di ottenere per impostare il Testo che si desidera.
Creare questo ValueConverter:
public class CountToSelectedTextConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((int)value == 1)
return "item selected";
else
return "items selected";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Aggiungere il namespace di riferimento per il montaggio del convertitore si trova:
xmlns:local="clr-namespace:ValueConverterExample"
Aggiungere il convertitore per le risorse:
<Window.Resources>
<local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>
Modificare il secondo controllo textblock:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>
Altri suggerimenti
In alternativa, è possibile sostituire il codice XAML con questo:
<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/>
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="items selected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="Text" Value="item selected"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Convertitori in grado di risolvere un sacco di associazione di problemi, ma avendo un sacco di specializzata convertitori diventa molto disordinato.