WPF:绑定到代码中的只读属性

时间:2010-11-15 16:50:59

标签: wpf binding properties readonly actualwidth

每当重新绘制面板时,我正在对valueconverter中的数据进行一些重新调整。我想将一些处理移动到viewmodel,因为大多数处理仅在控件大小或一些其他属性发生变化时才会发生。

为确保重新调整的数据看起来可以接受,我需要viewmodel中容器的ActualWidth。我想以一种方式将它绑定到viewmodel的属性,所以当它改变时我可以触发重新缩放处理。

我能找到的所有示例都将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 个答案:

答案 0 :(得分:2)

你不能这样做。您无法将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); } 
}