WPF中的基本数据绑定

时间:2012-11-20 17:52:20

标签: c# wpf xaml

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

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

我尝试了这个,但没有奏效:

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 个答案:

答案 0 :(得分:1)

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

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

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

  

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

.NET Framework 4.5文档没有说明相同的警告,但它似乎暗示了ReadOnly DP。我也在XAML中使用Triggers在线看到了解决方法。请参阅接受的答案后面的讨论here。这个讨论表明MS无意用ReadOnly DP解决这个问题。

答案 1 :(得分:0)

编辑:

您可能需要做三件事。

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

  2. 您还需要双向绑定,因为您希望从代码中设置Width / Height以及从用户捕获它。

  3. 您需要使用ActualWidth和ActualHeight进行绑定 - What is the difference between Width and ActualWidth in WPF?

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

答案 2 :(得分:0)

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

    public int Width 
    {
        get { return width; }
        set 
          {
            if(width != value)
              {
                 width = value;
                 NotifyPropertyChanged();
              }
          }
    }

答案 3 :(得分:0)

您可以尝试使用

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

但是这段代码可能无法每次都有效,因为在呈现UI之前,宽度和高度不可用。

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