1

我目前正在编写一个用于绘制类图的程序,并且正在使用 MVVM 模式。我的类在用户界面中的宽度和高度设置为自动,因为我让包含的元素定义大小。

问题是我需要模型中的宽度和高度来进行一些计算,所以我需要反向绑定或其他东西来更新模型中的属性,我对此不太了解。我该怎么做呢?

我试过这个,但没有奏效:

XAML:

Width="{Binding Width, Mode=OneWayToSource}" Height="{Binding Height,
Mode=OneWayToSource}">

C#

private int width;
    public int Width {
        get { return width; }
        set {
            width = value;
        }
    }
    private int height;
    public int Height {
        get { return height; }
        set {
            height = value;
        }
    }
4

4 回答 4

1

当您调整 XAML 指向的任何元素的大小时,您所拥有的应该正确更新您的宽度和高度成员变量。

如果您还想更新代码中的值并将其反映在 XAML 元素中,则需要INotifyPropertyChanged和 TwoWay 绑定。您也可以使用依赖属性,但您可能不想在 ViewModel 代码中这样做。

编辑:根据我下面的评论,您似乎想绑定到 ActualWidth 和 ActualHeight 属性。MS Silverlight 文档指出:

出于 ElementName 绑定的目的,ActualWidth 在更改时不会发布更新(由于其异步和运行时计算性质)。不要尝试将 ActualWidth 用作 ElementName 绑定的绑定源。如果您有需要基于 ActualWidth 进行更新的方案,请使用 SizeChanged 处理程序。

.NET Framework 4.5 文档没有说明相同的警告,但它似乎暗示了 ReadOnly DP。我还看到了使用 XAML 中的触发器在线解决此问题的方法。请参阅此处接受的答案之后的讨论。该讨论表明 MS 无意使用 ReadOnly DP 解决此问题。

于 2012-11-20T18:28:39.303 回答
0

编辑:

您可能需要做 3 件事。

  1. 您的类(定义了 Width 和 Height 属性的模型或视图模型)需要实现 INotifyPropertyChanged 接口。

  2. 您还需要两种方式绑定,因为您想从代码中设置宽度/高度以及从用户那里获取它。

  3. 您需要绑定 ActualWidth 和 ActualHeight - WPF 中的 Width 和 ActualWidth 有什么区别?

有关 INotifyPropertyChanged 的​​更多信息 - http://msdn.microsoft.com/en-us/library/ms743695.aspx

于 2012-11-20T18:26:46.450 回答
0

确保您的视图模型设置为视图的 DataContext。您需要在视图模型中实现INotifyPropertyChanged。然后,将您的属性更新为如下所示:

    public int Width 
    {
        get { return width; }
        set 
          {
            if(width != value)
              {
                 width = value;
                 NotifyPropertyChanged();
              }
          }
    }
于 2012-11-20T18:29:52.103 回答
0

你可以试试

ActualWidth="{Binding Width, Mode=OneWayToSource}" ActualHeight="{Binding Height,
Mode=OneWayToSource}">

但是此代码可能并非每次都有效,因为在呈现 UI 之前,实际的宽度和高度不可用。

或者,您可以在 VM 中创建依赖属性并将其与宽度和高度绑定,Mode=OneWay。但是当您使用 MVVM 时,您的框架应该支持这一点。

于 2012-11-21T06:34:21.870 回答