【问题标题】:Silverlight ChildWindow Size bindingSilverlight ChildWindow 大小绑定
【发布时间】:2011-06-27 01:19:20
【问题描述】:

我正在尝试将 ChildWindow Height 属性绑定到我的 viewmodel 属性,但我认为它仅在首次加载时读取 VM 值,并且在 VM 更改并通知更改时不会更改大小。在调试器中,我看到它进入 Height getter 一次,进一步的通知不会改变 ChildWindow 的大小..

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

听起来像是一次性绑定,但它是单向的..

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

进一步调查表明,当我们将绑定更改为Mode=TwoWay 并添加一个空设置器时,它开始按预期运行。但这并不能解释 OneWay 绑定不起作用的原因。传递给 setter 的值也等于我的整个应用程序高度,而不仅仅是显然应该更小的子窗口。

整个情况最奇怪的是:

这个值也被传递给setter 每次调用 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 属性触发。可能是一个围绕模式的转换器,但它目前以这种方式实现,因为我不确定在这种情况下具有几个魔法值的特殊转换器是一种更好的方法。

好的。模式设置器代码:

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

【问题讨论】:

  • 如果绑定中断,您应该检查 Visual Studio 中的“输出”窗口以获取更多信息
  • @HiTech Magic:+1 此刻难倒我。删除我的答案不够有用。如果我发现对你更有用的东西会重新发布。

标签: c# silverlight silverlight-4.0


【解决方案1】:

如果 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 绑定。

【讨论】:

  • 感谢您的想法。然而,一些非常奇怪的事情正在发生!当我在 TwoWay 中更改它时,它开始正常工作。但是,我在我的 setter 代码中添加了一个计数器和一个 count++ ,一旦它离开 getter ,这个 setter 就会被似乎不是我的代码,而是 childwindows 代码或其他东西击中 4 次。这可能会避免使用从 getter 读取一次的简单值更改绑定。那么谁在解雇 4 个二传手,为什么他们会覆盖单向绑定??
  • @Valentin - 如果设置了 ChildWindow.Height 属性,那么这就是删除绑定的原因。设置目标(即 ChildWindow.Height)时保留绑定的唯一方法是使用双向绑定。我会用更多信息更新我的答案。
  • 哎呀,我觉得后面有这样的事情。谢谢。现在我想知道我使用的这种双向绑定技巧是否保留了默认的 ChildWindow 行为?也许它不会像往常一样表现,即与默认子窗口相比,我的设置器将停止淡入淡出效果或其他东西?
  • @Valentin - 即使你的设置器是空的,这并不意味着 Height 属性不会改变。这只是意味着您的视图模型将不同步,但仍然绑定(因此对您的视图模型的更改将被推送到 ChildWindow)。但我可能会避免尝试设置 ChildWindow 的高度/宽度,而是设置 ChildWindow 内容的高度/宽度。
  • 我会将此标记为答案,但是我仍然想知道当我不让这 4 个 setter 调用按他们想要的方式执行时,我会失去什么功能..
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
相关资源
最近更新 更多