我正在编写一个绘制类图的程序,我正在使用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;
}
}
答案 0 :(得分:1)
当您调整XAML指向的任何元素时,您所拥有的内容应该正确更新宽度和高度成员变量。
如果您还想更新代码中的值并将其反映在XAML元素中,则需要INotifyPropertyChanged和TwoWay绑定。您也可以使用依赖项属性,但您可能不希望在ViewModel代码中执行此操作。
编辑:根据下面的评论,您似乎想要绑定到ActualWidth和ActualHeight属性。 MS Silverlight文档声明:
出于ElementName绑定的目的,ActualWidth在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。如果您的方案需要基于ActualWidth进行更新,请使用SizeChanged处理程序。
.NET Framework 4.5文档没有说明相同的警告,但它似乎暗示了ReadOnly DP。我也在XAML中使用Triggers在线看到了解决方法。请参阅接受的答案后面的讨论here。这个讨论表明MS无意用ReadOnly DP解决这个问题。
答案 1 :(得分:0)
编辑:
您可能需要做三件事。
您的类(定义了Width和Height属性的模型或视图模型)需要实现INotifyPropertyChanged接口。
您还需要双向绑定,因为您希望从代码中设置Width / Height以及从用户捕获它。
您需要使用ActualWidth和ActualHeight进行绑定 - What is the difference between Width and ActualWidth in WPF?
有关INotifyPropertyChanged的更多信息 - http://msdn.microsoft.com/en-us/library/ms743695.aspx
答案 2 :(得分:0)
确保将视图模型设置为视图的DataContext。您需要在视图模型中实现 INotifyPropertyChanged 。然后,将您的属性更新为如下所示:
public int Width
{
get { return width; }
set
{
if(width != value)
{
width = value;
NotifyPropertyChanged();
}
}
}
答案 3 :(得分:0)
您可以尝试使用
ActualWidth="{Binding Width, Mode=OneWayToSource}" ActualHeight="{Binding Height,
Mode=OneWayToSource}">
但是这段代码可能无法每次都有效,因为在呈现UI之前,宽度和高度不可用。
或者您可以在VM中创建依赖项属性,并使用Mode = OneWay将其与宽度和高度绑定。但是当你使用MVVM时,你的框架工作应该支持这个。