Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Silverlight儿童窗口大小绑定_C#_Silverlight_Silverlight 4.0 - Fatal编程技术网

C# Silverlight儿童窗口大小绑定

C# Silverlight儿童窗口大小绑定,c#,silverlight,silverlight-4.0,C#,Silverlight,Silverlight 4.0,我试图将ChildWindowHeight属性绑定到我的viewmodel属性,但我认为它只在第一次加载时读取VM值,并且在VM更改时不会更改大小并通知更改。在调试器中,我看到它进入Height getter一次,进一步的通知不会改变ChildWindow的大小 我认为它应该是可绑定的,所以我想知道这里是否存在一些问题,或者我犯了一些错误 听起来像是一次性绑定,但它是单向的 Height="{Binding WindowHeight,Mode=OneWay}" 进一步的研究表明,当我们将绑定

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

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

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

Height="{Binding WindowHeight,Mode=OneWay}" 
进一步的研究表明,当我们将绑定更改为
Mode=TwoWay
并添加一个空的setter时,它开始按照预期的方式工作。但这并不能解释单向绑定不起作用的原因。另外,传递给setter的值等于我的整个应用程序高度,而不仅仅是明显应该更小的childwindow

整个情况最奇怪的是:

该值也会传递给setter 4每次调用getter后都会连续执行多次(请参见
count++
用于计算的)

它是在对话框实际显示之前触发的,并且总是按顺序执行
get、set、set、set、set

视图模型的代码非常简单。代码中没有任何地方有人在使用ChildWindow高度,这是其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");
                }
            }
        }

如果ChildWindow或任何其他对象更改了Height属性,则绑定将丢失。尝试将其设置为双向绑定,并在视图模型的WindowHeight属性的setter中设置断点。这将告诉您是什么设置的,以及您是否可以使用
单向
绑定

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
    }
}

因此,如果使用“高度”或“宽度”属性,则无法使用单向绑定。

谢谢您的想法。然而,发生了一些非常奇怪的事情!当我以两种方式改变它时,它开始工作良好。然而,我已经在我的setter代码中添加了一个计数器和一个count+,一旦它离开getter,这个setter会被似乎不是我的代码,而是childwindows代码或其他东西击中4次。这可能可以避免使用从getter读取一次的简单值更改绑定。那么是谁触发了4个setter,以及为什么它们会覆盖单向绑定???@Valentin-如果有什么设置了ChildWindow.Height属性,那么这就是您的绑定被删除的原因。设置目标(即ChildWindow.Height)时保留绑定的唯一方法是使用双向绑定。我会用更多的信息更新我的答案。哦,我觉得这是背后的原因。谢谢现在我想知道我使用的这种双向绑定技巧是否保留了默认的ChildWindow行为?也许它不会像通常那样工作,即与默认的childwindow相比,我的setter将停止淡入淡出效果或其他功能?@Valentin-即使您的setter为空,也不意味着Height属性不会更改。这只意味着您的视图模型将不同步,但仍处于绑定状态(因此对视图模型的更改将被推送到ChildWindow)。但是我可能会避免尝试设置ChildWindow的高度/宽度,而是设置ChildWindow内容的高度/宽度。我会将此标记为答案,但是我仍然想知道,如果我不让这4个setter调用按它们想要的方式执行,我会失去什么功能。你应该检查“输出”窗口,以获取更多信息(如果绑定是breaking@HiTech魔法:+1,感谢你此刻难住我。删除了我的答案,因为它不够有用。如果我找到对你更有用的东西,我会转贴的。