Как я могу установить свойство зависимости для статического ресурса? - PullRequest
3 голосов
/ 05 мая 2011

Я пытаюсь обойти тот факт, что не могу указать динамическое значение для ConverterParameter. См. Другой мой вопрос, почему мне нужно привязать динамическое значение к ConverterParameter - мне не нравятся опубликованные в настоящее время решения, поскольку все они требуют, как мне кажется, ненужных изменений в моей модели представления.

Чтобы попытаться решить эту проблему, я создал собственный конвертер и открыл для него свойство зависимости:

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

Есть ли способ установить это значение с помощью привязки (или стилясеттер или другой сумасшедший метод) в моем 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>
<!- ... ->

Примеры, которые я видел до сих пор, связаны только со статическими ресурсами.

Редактировать:

Я получил некоторые отзывы о том, что есть только один экземпляр конвертера с XAML, который я опубликовал.

Я могу обойти это, поместив ресурс в свой элемент управления:

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

Итакэта проблема не блокируется необходимостью совместно использовать экземпляр конвертера:)

Ответы [ 2 ]

1 голос
/ 06 мая 2011

К сожалению, это не сработает - я уже шел по этому пути раньше, и оказалось, что все элементы в ItemsControl совместно используют один и тот же конвертер. Я думаю, что это связано с тем, как работает синтаксический анализатор XAML.

0 голосов
/ 06 мая 2011

Во-первых, вы можете указать конвертер в словаре ресурсов более высокого уровня и установить x:Shared на false, во-вторых, если вы хотите " установить значение для элемента из ItemsSource"в качестве комментария вы можете просто указать пустую привязку (Value="{Binding}").

...