我正在尝试将ChildWindow的
我认为它应该是可绑定的,所以我想知道是否存在某些问题或者我犯了错误?
听起来像是一次性绑定,但是它是单向的。
进一步的调查显示,当我们将绑定更改为
整个情况中最奇怪的事情是:
视图模型的代码非常简单。代码中没有任何人使用ChildWindow Height,它只在其xaml绑定中设置。
Height
属性绑定到我的视图模型属性,但我认为它只在第一次加载时读取VM值,并且在VM更改并通知更改时不会更改大小。在调试器中,我看到它只进入了一次高度getter,后续的通知不会改变ChildWindow的大小。我认为它应该是可绑定的,所以我想知道是否存在某些问题或者我犯了错误?
听起来像是一次性绑定,但是它是单向的。
Height="{Binding WindowHeight,Mode=OneWay}"
进一步的调查显示,当我们将绑定更改为
Mode=TwoWay
并添加一个空的setter时,它开始按预期运行。但这并不能解释为什么OneWay绑定不起作用。另外,传递给setter的值等于我的整个应用程序高度,而不仅仅是显然应该较小的childwindow。整个情况中最奇怪的事情是:
它在对话框实际显示之前触发,并且总是按顺序执行每次getter被调用后,这个值都会连续传递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个字符串文本,没有一个影响高度。
关于WindowHeight的通知并不是由WindowHeight属性触发的(如代码所示),而是由Mode属性触发的。可能会有一个围绕模式的转换器,但目前实现方式是这样的,因为我不确定一个具有几个魔法值的特殊转换器是否是更好的方法。
好的。模式setter代码:
public bool IsSpecialMode
{
get { return m_IsSpecialMode; }
set
{
if (m_IsSpecialMode!= value)
{
m_IsSpecialMode= value;
NotifyPropertyChanged("IsSpecialMode");
NotifyPropertyChanged("WindowHeight");
}
}
}