Lier Image.Source selon booléenne sans un convertisseur?
-
13-09-2019 - |
Question
Je veux avoir une image liée à un booléen et ont la source de l'image dépend de la valeur booléenne
i.e.. véritable source = "image1" false source = "image2"
Je me demandais s'il y a une façon de le faire en ligne sans avoir besoin d'un convertisseur.
La solution
Vous pouvez créer un style sur l'image qui utilise un DataTrigger pour échanger la source d'image en fonction d'une liaison. Dans cet exemple, l'image change en fonction de la valeur d'un booléen appelé simplement « Value ».
<Image Width="16">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Value}" Value="False">
<Setter Property="Source" Value="Resources/image1.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Value}" Value="True">
<Setter Property="Source" Value="Resources/image2.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Autres conseils
Si quelqu'un est à la recherche de Value Converter pour la liaison. Voici ce que je
<Image Source="{Binding Converter={StaticResource ImageConverter},ConverterParameter=\{Status\}}" />
public class StatusToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string statusValue = parameter.ToString().ToUpper();
if (!string.IsNullOrEmpty(statusValue))
{
string result = string.Empty;
switch (statusValue)
{
case "IDLE":
result = "idle.png";
break;
case "OFFLINE":
result = "offline.png";
break;
default:
result = "online.png";
break;
}
var uri = new Uri("pack://application:,,,/PIE;component/Images/" + result);
return uri;
}
return string.Empty;
}
// No need to implement converting back on a one-way binding
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
Borné Enum
public enum DevStatus
{
Idle = 1,
Offline = 2,
Active = 3,
}
Set Enum de ViewModel et convertisseur lier l'image appropriée.
<Image Source="{Binding DevStatus, Converter={StaticResource ImageConverter}}" />
Si vous êtes juste lier la propriété Image::Source
directement alors la seule façon d'y arriver est avec un IValueConverter
personnalisé.