c# - Silverlight ChildWindow 大小绑定(bind)

标签 c# silverlight silverlight-4.0

我正在尝试将 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/

相关文章:

刷新浏览器时,Silverlight 页面未加载

c# - EnableCors 属性未向 API 响应添加 Access-Control-Allow-Origin

c# - 将 WP8 升级到 Silverlight WP8.1,有效负载包含两个或更多具有相同目标的文件

c# - 如何创建从 FrameworkElement 派生的自定义复合控件

silverlight - SoapFaultException 时如何将 STATUS CODE 设置为 200?

silverlight - wp7 中后台代理的工作

silverlight - 如何将一个xaml页面导航到另一个页面?

c# - 为什么 EF4 Code First 在存储对象时这么慢?

c# - 从具有多个参数的 C# 代码运行应用程序

c# - 从自动生成的 [assembly].xml 文件中将 XML 注释重新插入到 C# 源文件树中