J'ai le prochain xaml:
<ToolbarTray Visibility="{Binding SomeProperty}">
<Toolbar>
<Checkbox IsEnabled="{Binding IsEnabled}/"
<... other items />
</Toolbar>
</Toolbar>
et deux classes comme contexte de données possible - pour deux fenêtres différentes.
class ToolbarContextOne
{
public Visibility SomeProperty {get;set;}
}
class ToolbarContextTwo:ToolbarContextOne
{
public bool IsEnabled {get;set;}
}
Je cache toolbartray de l'exemple lorsque je n'en ai pas besoin. Mais même si SomeProperty est défini sur Visibility.Collapsed, j'obtiens toujours des erreurs de liaison pour l'option IsEnabled lorsque j'utilise ToolbarContextOne comme contexte de données. Je soupçonne que cela arrive parce que c'est ainsi que fonctionne l'analyseur. Mais peut-être existe-t-il un moyen d'éviter ce problème sans que mes classes de contexte de données ne changent?
Le moyen le plus simple d'éviter les erreurs de liaison consiste à utiliser FallbackValue
dans la liaison:
<ToolbarTray Visibility="{Binding SomeProperty}">
<Toolbar>
<Checkbox IsEnabled="{Binding IsEnabled, FallbackValue=False}/"
<... other items />
</Toolbar>
</Toolbar>
Mise à jour
Une autre méthode consisterait à activer la liaison uniquement lorsque DataContext a une propriété spécifique:
<CheckBox>
<CheckBox.Resources>
<local:HasPropertyConverter x:Key="HasPropertyConverter"/>
</CheckBox.Resources>
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=.,Converter={StaticResource HasPropertyConverter},
ConverterParameter=IsEnabled}"
Value="True">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
et convertisseur:
public class HasPropertyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return false;
}
if (parameter == null)
{
return false;
}
PropertyInfo property = value.GetType().GetProperty(parameter.ToString());
return property != null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots