我正在尝试将 ChildWindow Height
属性绑定(bind)到我的 viewmodel 属性,但我认为它只在第一次加载时读取 VM 值,并且在 VM 更改时不会更改大小并通知更改。在调试器中,我看到它进入 Height getter 一次,进一步的通知不会改变 ChildWindow 的大小..
我认为它应该是可绑定(bind)的,所以我想知道这里是否存在问题或者我做错了什么?
听起来像是一次性绑定(bind),但它是单向的..
Height="{Binding WindowHeight,Mode=OneWay}"
进一步的调查表明,当我们将绑定(bind)更改为 Mode=TwoWay
并添加一个空的 setter 时,它开始按预期运行。但这并不能解释 OneWay 绑定(bind)不起作用的原因。传递给 setter 的值也等于我的整个应用程序高度,而不仅仅是显然应该更小的子窗口。
整个情况中最奇怪的事情如下:
Also this value is passed to setter 4 consecutive times everytime after a getter is called (see
count++
that is used to count that).
它在对话框实际显示之前触发,并且总是按顺序 get,set,set,set,set
View 模型的代码非常简单。代码中没有任何人使用 ChildWindow 高度,它仅在其 xaml 绑定(bind)中设置,如上所示。
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");
}
}
}
最佳答案
如果 ChildWindow 或任何其他对象更改了 Height 属性,则您的绑定(bind)将丢失。尝试将其设置为 TwoWay
绑定(bind)并在 View-model 的 WindowHeight 属性的 setter 中设置一个断点。这将告诉您设置它的内容以及您是否可以拥有 OneWay
绑定(bind)。
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 绑定(bind)。
关于c# - Silverlight ChildWindow 大小绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487831/