每当重新绘制面板时,我正在对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); } }
答案 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); }
}