2011-06-27 55 views
3

我想将ChildWindow Height属性绑定到我的viewmodel属性,但我认为它只在第一次加载时读取VM值,并且在虚拟机更改&通知有关更改时不会更改大小。在调试器中,我发现它一旦进入Height getter,进一步的通知不会改变ChildWindow的大小。Silverlight ChildWindow Size binding

我认为它应该是可绑定的,所以我想知道这里是否存在某个问题或者我犯了一些错误?

听起来像是一次约束力,但它的单向..

Height="{Binding WindowHeight,Mode=OneWay}" 

进一步的研究表明,当我们改变结合Mode=TwoWay,并添加一个空的二传手它开始像预期的那样。但是这并不能解释OneWay绑定不起作用的原因。同样,传递给setter的值等于我的整个应用程序高度,而不仅仅是显然应该更小的childwindow。

这整个情况的最奇怪的是以下几点:

而且这个值传给每次设定器 连续四次调用getter时后(见 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属性触发。很可能是一个转换器模式,但它目前以这种方式实现,因为我不确定具有两个魔术值的特殊转换器对于这种情况是更好的方法。

oks。模式设置代码:

public bool IsSpecialMode 
     { 
      get { return m_IsSpecialMode; } 
      set 
      { 
       if (m_IsSpecialMode!= value) 
       { 
        m_IsSpecialMode= value; 
        NotifyPropertyChanged("IsSpecialMode"); 
        NotifyPropertyChanged("WindowHeight"); 
       } 
      } 
     } 
+0

如果绑定正在中断,您应该在Visual Studio中检查您的“输出”窗口以获取更多信息 – Rumplin

+0

@HiTech Magic:此刻用于锁定我的+1。删除我的答案,因为没有足够的帮助。如果我找到对你更有用的东西,我会重新发布。 –

回答

1

如果ChildWindow或任何其他对象更改Height属性,则绑定将丢失。尝试将其设置为TwoWay绑定,并在View模型的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 
    } 
} 

所以,如果效果,它看起来就像你不能用一个单向的高度或宽度属性绑定。

+0

感谢您的想法。然而,很奇怪的事情正在发生!当我在TwoWay中更改它时,它开始正常工作。然而,我在我的setter代码中添加了一个计数器和一个count ++,一旦它离开getter,这个setter被命中四次,看起来不是我的代码,而是childwindows代码或其他东西。这可能会节省绑定的内容,使用从getter读取的简单值进行更改。那么谁发射了4个setter以及为什么他们重​​写oneway绑定? –

+0

@Valentin - 如果设置了ChildWindow.Height属性,那么这就是您的绑定被删除的原因。在设置目标(即ChildWindow.Height)时保留绑定的唯一方法是使用双向绑定。我会用更多的信息更新我的答案。 – CodeNaked

+0

Doh我觉得像这样的东西在背后。谢谢。现在我想知道我使用的这种双向绑定技巧是否保留了默认的ChildWindow行为?也许它不会像往常一样运行,也就是说,与默认的子窗口相比,我的setter将停止淡入淡出效果或工作。 –

相关问题