我试图将ChildWindow Height
属性绑定到我的viewmodel属性,但是我认为它仅在首次加载时读取VM值,并且在VM更改并通知更改时不更改大小。在调试器中,我看到它一次进入Height getter,进一步的通知不会更改ChildWindow的大小。
我认为它应该具有约束力,所以我想知道这里是否存在某些问题还是我在做一些错误?
听起来像是一次绑定,但它是单向的。
Height="{Binding WindowHeight,Mode=OneWay}"
进一步的研究表明,当我们更改对
Mode=TwoWay
的绑定并添加一个空的setter时,它开始表现出预期的行为。但这并不能解释OneWay绑定不起作用的原因。传递给setter的值也等于我整个应用程序的高度,而不仅仅是子窗口,这个子窗口显然应该较小。在这种情况下,最奇怪的是:
此值也传递给setter
每次调用吸气剂后连续4次(请参阅
count++
用于计数)。在实际显示对话框之前将其触发,并且始终按顺序
get,set,set,set,set
视图模型的代码非常简单。在代码中,没有人在使用ChildWindow Height,它仅在xaml绑定中设置,如上所示。
private int count = 0;
public int WindowHeight
{
get { return IsDefaultMode? DEFAULT_HEIGHT : SPECIAL_HEIGHT; }
set {count++; }
}
我继承的Childwindow类包含大约5个文本字符串,它们都不以任何方式影响Height。
WindowHeight属性(如代码所示)不会触发有关WindowHeight的通知,而Mode属性会触发该通知。本来可以是围绕模式的转换器,但是目前以这种方式实现,导致我不确定在这种情况下使用带有几个魔术值的特殊转换器是否更好。
好的。模式设置器代码:
public bool IsSpecialMode
{
get { return m_IsSpecialMode; }
set
{
if (m_IsSpecialMode!= value)
{
m_IsSpecialMode= value;
NotifyPropertyChanged("IsSpecialMode");
NotifyPropertyChanged("WindowHeight");
}
}
}
最佳答案
如果ChildWindow或任何其他对象更改了Height属性,则绑定将丢失。尝试将其设置为TwoWay
绑定,然后在视图模型的WindowHeight属性的设置器中设置一个断点。这将告诉您正在设置什么以及是否可以具有OneWay
绑定。
ChildWindow类实际上将设置其自己的Height和Width属性。例如,以下代码确保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
}
}
因此,如果效果良好,您似乎无法在Height或Width属性上使用OneWay绑定。