Пользовательская привязка WPF - PullRequest
2 голосов
/ 22 июня 2011

У меня есть пользовательское MarkupExtension, которое имитирует привязку.Он хорошо работает в обычных назначениях, но при использовании в установщиках стилей, например:

<Setter Property="Content" Value="{local:MyExtension}" />

приводит к XamlParseException:

A 'Binding' cannot be set on the 'Value' property of type 'Setter'.
A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

Это реализация расширения:

public class MyExtension : MarkupExtension
{
    public MyExtension()
    {
        Value = 123;
    }

    public object Value
    {
        get;
        set;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var binding = new Binding("Value")
        {
            Source = this,
        };
        return binding.ProvideValue(serviceProvider);
    }
}

В чем проблема?!

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Это своего рода догадка, но, скорее всего, потому, что компилятор XAML имеет специальную встроенную поддержку класса Binding, что позволяет использовать его в этом сценарии (и других).Класс Binding также является MarkupExtension, но, к сожалению, он запечатывает свою реализацию ProvideValue().

Тем не менее, вы можете просто сойти с рук:

public class MyBinding : Binding
{
    private object value;

    public object Value
    {
        get { return this.value; }
        set
        {
            this.value = value;
            this.Source = value;
        }
    }
}

Так какProvideValue все равно вернет экземпляр Binding.

0 голосов
/ 18 июня 2014

почему ты не

return Value

внутри ProvideValue ??

еще

Вы можете привязать только к DependencyProperty. создайте свойство зависимости для Value в вашем MyExtension классе!

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Object), typeof(MyContentControl), new UIPropertyMetadata());
0 голосов
/ 22 июня 2011

Из документации видно, что объект должен быть замораживаемым (чтобы его могли обмениваться различными заинтересованными сторонами)

http://msdn.microsoft.com/en-us/library/system.windows.setter.value.aspx

"Привязка данных и динамические ресурсы внутри объекта поддерживаются, если указанное значение является объектом Freezable. См. Расширение разметки привязки и Расширение разметки DynamicResource."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...