我试图将ChildWindow Height属性绑定到viewmodel属性,但我认为它只在第一次加载时读取VM值,并且在VM更改时不会更改大小&通知更改。在调试器中,我看到它一旦进入高度getter,进一步的通知不会更改ChildWindow大小。
我认为它应该是可绑定的,所以我想知道这里是否存在一些问题,还是我做错了什么?
听起来像是一次绑定,但它的单向..。
Height="{Binding WindowHeight,Mode=OneWay}" 进一步的研究表明,当我们更改绑定到Mode=TwoWay并添加一个空的setter时,它开始按照预期的方式运行。但这并不能解释为什么OneWay绑定不能工作。传递给setter的值也等于我的整个应用程序高度,而不仅仅是明显应该更小的子窗口。
在这种情况下,最奇怪的是:
还会在调用getter之后,每次都将此值连续传递给setter 4 (参见用于计数该值的
count++)。
它是在实际显示对话框之前触发的,并且总是按照get,set,set,set,set顺序进行。
视图模型的代码非常简单。在代码中,没有人使用ChildWindow高度,它仅在xaml绑定中设置,如上面所示。
private int count = 0;
public int WindowHeight
{
get { return IsDefaultMode? DEFAULT_HEIGHT : SPECIAL_HEIGHT; }
set {count++; }
}我的“继承儿童窗口”类包含5个文本字符串,它们中没有任何一个以任何方式影响高度。
有关WindowHeight的通知不是由WindowHeight属性(如代码中所示)触发的,而是由Mode属性触发的。本可以是一个转换模式,但它目前的实现方式,因为我不确定一个特殊的转换器具有两个神奇的值,在这种情况下是一个更好的方法。
好的。模式设置程序代码:
public bool IsSpecialMode
{
get { return m_IsSpecialMode; }
set
{
if (m_IsSpecialMode!= value)
{
m_IsSpecialMode= value;
NotifyPropertyChanged("IsSpecialMode");
NotifyPropertyChanged("WindowHeight");
}
}
}发布于 2011-06-27 01:52:10
如果ChildWindow或任何其他对象更改“高度”属性,则您的绑定将丢失。尝试将其设置为TwoWay绑定,并在视图模型的WindowHeight属性的设置器中设置一个断点。这将告诉您设置它的内容,以及是否可以使用OneWay绑定。
ChildWindow类实际上将设置它自己的高度和宽度属性。例如,下面的代码确保ChildWindow始终覆盖应用程序的根内容。这允许ChildWindow在显示其弹出时提供覆盖效果或褪色效果:
private void UpdateOverlaySize()
{
if (((this.Overlay != null) && (Application.Current != null)) && ((Application.Current.Host != null) && (Application.Current.Host.Content != null)))
{
base.Height = Application.Current.Host.Content.ActualHeight;
base.Width = Application.Current.Host.Content.ActualWidth;
// ... other code removed
}
}因此,如果效果良好,您就不能在高度或宽度属性上使用OneWay绑定。
https://stackoverflow.com/questions/6487831
复制相似问题