Comment définir une propriété de dépendance sur une ressource statique?
j'essaie de contourner le fait que je ne peux pas spécifier une valeur dynamique pour ConverterParameter
. Voir mon autre question pour savoir pourquoi je dois lier une valeur dynamique à ConverterParameter
- Je n'aime pas les solutions actuellement publiées parce qu'elles exigent toutes ce que je pense devrait être des changements inutiles à mon modèle de vue.
pour tenter de résoudre cela, j'ai créé un convertisseur personnalisé, et exposé une propriété de dépendance sur ce convertisseur:
public class InstanceToBooleanConverter : DependencyObject, IValueConverter
{
public object Value
{
get { return (object)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(object), typeof(InstanceToBooleanConverter), null);
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null && value.Equals(Value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? Value : Binding.DoNothing;
}
}
y a-t-il un moyen de définir cette valeur en utilisant une reliure (ou un setter de style, ou une autre méthode folle) dans mon XAML?
<ItemsControl ItemsSource="{Binding Properties}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:SomeClass}">
<DataTemplate.Resources>
<!-- I'd like to set Value to the item from ItemsSource -->
<local:InstanceToBooleanConverter x:Key="converter" Value="{Binding Path=???}" />
</DataTemplate.Resources>
<!- ... ->
les exemples que j'ai vus jusqu'à présent ne concernent que les ressources statiques.
Edit:
j'ai reçu quelques commentaires qu'il n'y a qu'une seule instance de convertisseur avec le XAML que j'ai posté.
je peux contourner cela en plaçant la ressource dans mon contrôle:
<ItemsControl ItemsSource="{Binding Properties}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:SomeClass}">
<RadioButton Content="{Binding Name}" GroupName="Properties">
<RadioButton.Resources>
<!-- I'd like to set Value to the item from ItemsSource -->
<local:InstanceToBooleanConverter x:Key="converter"
Value="{Binding Path=???}" />
</RadioButton.Resources>
<RadioButton.IsChecked>
<Binding Path="DataContext.SelectedItem"
RelativeSource="{RelativeSource AncestorType={x:Type Window}}"
Converter="{StaticResource converter}" />
</RadioButton.IsChecked>
</RadioButton>
<!- ... ->
donc ce problème n'est pas bloqué en ayant à partager une instance du convertisseur:)
2 réponses
malheureusement, cela ne va pas fonctionner - j'ai été sur cette route avant et il s'avère que tous les éléments dans le ItemsControl partagent le même Convertisseur. Je pense que cela est dû à la façon dont l'analyseur XAML fonctionne.
tout d'abord , vous pouvez spécifier le convertisseur à un dictionnaire de ressources de niveau supérieur et mettre x:Shared
à false
, deuxièmement si vous voulez " définir la valeur de L'élément de la source "comme vous annoté, vous pouvez juste spécifier une liaison vide ( Value="{Binding}"
).