WPF: привязка к свойству только для чтения в коде - PullRequest
1 голос
/ 15 ноября 2010

В настоящее время я выполняю некоторые изменения масштаба данных в преобразователе значений всякий раз, когда панель перерисовывается. Я хочу переместить часть этой обработки в модель представления, так как большая часть обработки происходит только при изменении размера элемента управления или нескольких других свойств.

Чтобы убедиться, что масштабированные данные выглядят приемлемыми, мне нужно ActualWidth контейнера в модели представления. Я хочу привязать его к свойству модели представления одним способом, чтобы при его изменении я мог запустить обработку изменения масштаба.

Все примеры, которые я смог найти, связывают свойство CLR или зависимости с элементом, а не каким-либо другим способом, и я явно упускаю что-то в моем понимании, чтобы понять, как мне это сделать. Я пробовал несколько разных вещей при настройке привязки, но просто не правильно понял.

Есть намеки? спасибо.

В MyView XAML:

<myItemsControl/>

В коде MyView что-то вроде:

Binding b = new Binding(MyWidthProperty);
b.Mode = BindingMode.OneWay;
b.Source = myItemsControl.Name;
.........?

и

public static readonly DependencyProperty MyWidthProperty = 
DependencyProperty.Register( "MyWidth", typeof(Double), typeof(MyViewModel));

В MyViewModel:

    public Double MyWidth{
        get { return _myWidth; }
        set { _myWidth = value; ViewChanged(this); } }

1 Ответ

2 голосов
/ 15 ноября 2010

Вы не можете сделать это таким образом. Вы не можете установить Binding на ActualWidth, так как он доступен только для чтения.

Вы можете установить привязку только к MyWidth. Но для этого вам нужно сначала преобразовать MyWidth в DependencyProperty. Тогда вы сможете сделать что-то вроде

Binding b = new Binding("ActualWidth") { Source = myItemsControl };
this.SetBinding(MyViewModel.MyWidthProperty, b);

Для преобразования в свойство зависимости вам нужно заменить определение MyWidth следующим:

public static readonly DependencyProperty MyWidthProperty =
    DependencyProperty.Register("MyWidth", typeof(double), typeof(MyViewModel),
                                        new UIPropertyMetadata(
                                            0.0,
                                            (d, e) =>
                                            {
                                                var self = (MyViewModel)d;
                                                ViewChanged(self);
                                            }));

Но будьте осторожны со свойствами зависимостей; лучше сначала прочитать документацию.

Редактировать: Вам также необходимо определить свойство следующим образом:

public double MyWidth
{
    get { return (double)this.GetValue(MyWidthProperty); }
    set { this.SetValue(MyWidthProperty, value); } 
}
...