Silverlight ChildWindow 大小绑定

3
我正在尝试将ChildWindow的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");
                }
            }
        }

如果绑定出现问题,您应该在Visual Studio中检查“输出”窗口以获取更多信息。 - Rumplin
@HiTech Magic:你真是太厉害了!我现在无话可说。我的回答不够有帮助,已经删除了。如果我找到更有用的东西,我会再次发布的。 - iCollect.it Ltd
1个回答

1

如果ChildWindow或其他对象更改了Height属性,则绑定将丢失。尝试将其设置为TwoWay绑定,并在View-model的WindowHeight属性的setter中设置断点。这将告诉您是什么设置了它以及是否可以使用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
    }
}

因此,实际上,似乎您无法在高度或宽度属性上使用单向绑定。


谢谢您的想法。但是有些非常奇怪的事情正在发生!当我在TwoWay中更改它时,它开始正常工作。但是我已经在我的setter代码中添加了一个计数器和count++,一旦它离开getter,这个setter被触发了4次,看起来不是我的代码,而是子窗口的代码或其他东西。这可能会防止绑定使用从getter读取一次的简单值进行更改。那么是谁触发了4个setter,为什么它们覆盖了单向绑定? - Valentin Kuzub
@Valentin - 如果某些东西设置了ChildWindow.Height属性,那么这就是你的绑定被移除的原因。当目标(即ChildWindow.Height)被设置时,保留绑定的唯一方法是使用双向绑定。我会在我的答案中更新一些更多的信息。 - CodeNaked
糟糕,我感觉落后了。谢谢提醒。现在我在想,我使用的这种双向绑定技巧是否保留了默认的ChildWindow行为?也许它不会像通常那样工作,即与默认的ChildWindow相比,我的setter将停止淡入淡出效果或其他一些功能? - Valentin Kuzub
@Valentin - 即使您的setter为空,也并不意味着Height属性不会改变。这只是意味着您的视图模型将不同步,但仍然绑定(因此对视图模型的更改将被推送到ChildWindow)。但我可能会避免尝试设置ChildWindow的高度/宽度,而是设置ChildWindow内容的高度/宽度。 - CodeNaked
我会将其标记为答案,但我仍然想知道如果我不让这4个setter调用按照它们想要的方式执行,我会失去哪些功能。 - Valentin Kuzub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接