【问题标题】:wpf Window Width not bindingwpf窗口宽度不绑定
【发布时间】:2010-07-19 18:10:22
【问题描述】:

我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。

这看起来很简单。

<Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" />

但是没有。它不起作用。

它检查 ViewModel 的 Width,但不检查 Height

奇怪的是,如果我在 XAML 中切换WidthHeight 的顺序,它会检查Height 而不是Width。即它只检查两个属性中的第一个而完全忽略第二个。

绑定MaxHeightMinHeight 确实有效,即使在Width 之后也是如此。但随后用户无法重新调整窗口大小。

【问题讨论】:

    标签: binding


    【解决方案1】:

    不知道您的 ViewModel 代码是什么样的,但请尝试为 Width 和 Height 属性创建一个集合并将绑定模式设置为 TwoWay

    【讨论】:

      【解决方案2】:

      你的窗口的加载事件中应该有这样的东西:

          public void AfterLoad()
          {
              this.Height = this.ViewModel.Settings.WindowHeight;
              this.Width = this.ViewModel.Settings.WindowWidth;
      
              if (this.ViewModel.Settings.WindowTop > 0 && this.ViewModel.Settings.WindowLeft > 0)
              {
                  this.Top = this.ViewModel.Settings.WindowTop;
                  this.Left = this.ViewModel.Settings.WindowLeft;
              }
          }
      

      然后,处理窗口的大小更改事件以记住宽度和高度以及位置更改以记住顶部,左侧(如果您愿意)。

      绑定到 WindowState 工作正常。

      【讨论】:

      • 正确。只需在 Settings.Default.WindowHeight 中添加“默认”即可。
      【解决方案3】:

      我也遇到了这个问题,好像是个bug。

      现在我只是在处理 Window 的 DataContextChanged 事件并手动从 ViewModel 设置 Width 和 Height。

      【讨论】:

      • 谢谢 - 这条评论似乎是唯一对我有用的想法,但我仍然认为我们应该能够正确更改绑定并查看 UI 中反映的结果.. 任何人实际上都得到了这个工作正常吗?
      【解决方案4】:

      这在设计上是正确的(可悲但真实)。布局系统实际上并不强制执行这些值,请参阅 Window.Height 的 msdn 文档页面上的备注... 在某些情况下,可以接受设置 MinWidth 和 MaxWidth (resp. *Height) 来实现类似的行为,但并非总是如此。

      很抱歉没有更好的消息...

      【讨论】:

      【解决方案5】:

      您希望绑定到 ActualHeight 和 ActualWidth,而不是 Height 和 Width。

      所以而不是:

      <Window ... Width="{Binding Path=Width}" Height="{Binding Path=Height}" />
      

      你想要:

      <Window ... Width="{Binding Path=ActualWidth}" Height="{Binding Path=ActualHeight}" />
      

      【讨论】:

        【解决方案6】:

        我假设您正在使用 MVVM 模式以及通过在 ViewModel 中实现 INotifiyPropertyChanged-Interface 将任何更改的属性从 ViewModel 提升到 View 的常用方法。

        不工作:

        WdwWidth = 600;
        WdwHeight = 600;
        
        RaisePropertyChanged("WdwWidth");
        RaisePropertyChanged("WdwHeight");
        

        工作:

        WdwWidth = 600;
        RaisePropertyChanged("WdwWidth");
        
        WdwHeight = 600;
        RaisePropertyChanged("WdwHeight");
        

        在我看来,必须在属性实际更改后立即引发 PropertysChanged 通知。 奇怪,但对我有用。

        编辑:确保将绑定设置为双向,例如Height="{Binding Path=WdwHeight, Mode=TwoWay}"

        【讨论】:

          猜你喜欢
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          • 2015-11-30
          • 2011-02-10
          • 1970-01-01
          • 2011-08-17
          • 2012-09-02
          • 2018-12-11
          相关资源
          最近更新 更多