我目前正在编写一个绘制类图的程序,并且正在使用MVVM模式。我的类在用户界面中的宽度和高度设置为auto,因为我让包含的元素定义大小。
问题是我需要模型中的宽度和高度来做一些计算,所以我需要一个反向绑定或者一些东西来更新我的模型中的属性,这一点我不太了解。我该怎么做?
我试过了,但没成功:
XAML:
Width="{Binding Width, Mode=OneWayToSource}" Height="{Binding Height,
Mode=OneWayToSource}">C#
private int width;
public int Width {
get { return width; }
set {
width = value;
}
}
private int height;
public int Height {
get { return height; }
set {
height = value;
}
}发布于 2012-11-20 18:28:39
当调整XAML所指向的任何元素的大小时,您所拥有的应该正确地更新您的宽度和高度成员变量。
如果还想更新代码中的值并将其反映在XAML元素中,则需要INotifyPropertyChanged和TwoWay绑定。您也可以使用依赖项属性,但是您可能不希望在ViewModel代码中这样做。
编辑:根据我下面的评论,您似乎希望绑定到ActualWidth和ActualHeight属性。Silverlight女士的文件说:
为了ElementName绑定的目的,ActualWidth不会在其更改时发布更新(因为它的异步和运行时计算性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。如果您的场景需要基于ActualWidth的更新,请使用SizeChanged处理程序。
.NET Framework4.5文档并没有提出相同的警告,但它似乎是ReadOnly DP的暗示,我也看到了在XAML中使用触发器的解决方法。请参见接受的答案这里后面的讨论。这个讨论表明MS无意用ReadOnly DP来解决这个问题。
发布于 2012-11-20 18:26:46
编辑:
有三件事你可能要做。
关于INotifyPropertyChanged - http://msdn.microsoft.com/en-us/library/ms743695.aspx的更多信息
发布于 2012-11-20 18:29:52
确保将视图模型设置为视图的DataContext。您需要在视图模型中实现INotifyPropertyChanged。然后,更新属性如下:
public int Width
{
get { return width; }
set
{
if(width != value)
{
width = value;
NotifyPropertyChanged();
}
}
}https://stackoverflow.com/questions/13479117
复制相似问题