在DataBinding中访问属性的属性

时间:2016-10-04 11:28:28

标签: c# wpf data-binding properties

我的ViewModel中有两个公共属性FooBarFoo只是一个字符串,Bar是一个具有公共属性Name的字符串。

我想将Bar.Name绑定到某个GUI元素。 我该怎么做?

<Label Content="{Binding Foo}">按预期将字符串Foo写入标签。

但是<Label Content="{Binding Bar.Name}">没有将Bar的名称写入标签。相反,标签保持空白。

编辑: 我的XAML的DataContext(以及Label的{1}}设置为ViewModel。

EDIT2:当然,真正的代码并不像上面描述的那么简单。我构建了一个仅代表上述描述的最小工作示例:

XAML:

<Window x:Class="MyTestNamespace.MyXAML"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <StackPanel>
        <Label Content="{Binding Foo}"></Label>
        <Label Content="{Binding Bar.Name}"></Label> <!-- Works fine! -->
    </StackPanel>
</Window>

视图模型:

namespace MyTestNamespace
{
    class MyVM
    {
        public string Foo { get; set; }
        public MyBar Bar { get; set; }

        public MyVM()
        {
            Foo = "I am Foo.";
            Bar = new MyBar("I am Bar's name.");
        }
    }

    class MyBar
    {
        public string Name { get; set; }

        public MyBar(string text)
        {
            Name = text;
        }
    }
}

这实际上是按预期工作的。由于我无法与您分享实际代码(太多并且由公司拥有),我需要自己搜索原因。欢迎任何有关可能原因的提示!

2 个答案:

答案 0 :(得分:0)

1.Your Model.cs:

public class Model : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
             PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

2.您的ViewModel:

  public MainViewModel()
  {
     _model = new Model {Name = "Prop Name" };  
  }



  private Model _model;
  public Model Model
  {
      get
      {
          return _model;
      }
      set
      {
          _model = value;     
      }
  }

3.您的View,将DataContext设置为ViewModel:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" 
    DataContext="{StaticResource MainViewModel}">
<Grid>
    <Label Content="{Binding Model.Name}"/>
</Grid>

答案 1 :(得分:0)

感谢Vignesh N。的评论,我能够解决问题。

在实际代码中Bar可以更改,但在开始时它的名称是空字符串。这是Label打开窗口时显示的内容。由于Label属性更改时未通知Bar,因此不会更新。

解决方案:让ViewModel实现INotifyPropertyChanged接口并定义Bar,如下所示:

private MyBar _bar;
public MyBar Bar
{
    get
    {
        return _bar;
    }

    set
    {
        if (_bar != value)
        {
            _bar = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Bar)));
        }
    }
}