C# Silverlight儿童窗口大小绑定
我试图将ChildWindowC# Silverlight儿童窗口大小绑定,c#,silverlight,silverlight-4.0,C#,Silverlight,Silverlight 4.0,我试图将ChildWindowHeight属性绑定到我的viewmodel属性,但我认为它只在第一次加载时读取VM值,并且在VM更改时不会更改大小并通知更改。在调试器中,我看到它进入Height getter一次,进一步的通知不会改变ChildWindow的大小 我认为它应该是可绑定的,所以我想知道这里是否存在一些问题,或者我犯了一些错误 听起来像是一次性绑定,但它是单向的 Height="{Binding WindowHeight,Mode=OneWay}" 进一步的研究表明,当我们将绑定
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,感谢你此刻难住我。删除了我的答案,因为它不够有用。如果我找到对你更有用的东西,我会转贴的。