在 wpf 中绑定一个 属性 inside observerList

Binding a property inside observerList in wpf

我正在用 C#、WPF 编写应用程序,XAML 使用 MVVM 模式。

在我创建了很多在线示例之后,我尝试绑定到 UI 的数据没有显示在屏幕上。

我的架构是:在 MainViewModel 中,我有一个来自类型系列的 ObserverList, 在 Family class 中,我有一个类型为 Child 的 ObserverList, 在 Child class 我有姓名。

如何将 Child 名称绑定到 TextBlock?

我创建的一些示例: https://msdn.microsoft.com/en-us/library/aa970558%28v=vs.110%29.aspxv

<Window x:Class="DataTemplates.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DataTemplates"
        Title="MainWindow"
        Height="350"
        Width="525">
  <Window.Resources>
    <DataTemplate x:Key="MyDataTemplate"
                  DataType="local:MyData">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0"
                   Text="First Name: " />
        <TextBlock Grid.Column="1"
                   Text="{Binding Path=FirstName}" />
        <TextBlock Grid.Column="2"
                   Text="Last Name: " />
        <TextBlock Grid.Column="3"
                   Text="{Binding Path=LastName}" />
        <CheckBox Grid.Column="4"
                  Content="Is Lecturer?"
                  IsEnabled="False"
                  IsChecked="{Binding Path=IsLecturer}" />
      </Grid>
    </DataTemplate>
  </Window.Resources>
  <StackPanel>
    <ListBox ItemsSource="{Binding}"
             ItemTemplate="{StaticResource MyDataTemplate}"
             HorizontalContentAlignment="Stretch" />
    <Button Content="Add"
            Click="Button_Click" />
  </StackPanel>
</Window>

和后面的代码

using System.Collections.ObjectModel;
using System.Windows;

namespace CollectionDemo
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {
    private ObservableCollection<MyData> _myCollection =
      new ObservableCollection<MyData>();

    public MainWindow()
    {
      InitializeComponent();

      DataContext = _myCollection;
      _myCollection.Add(
        new MyData
        {
          FirstName = "Arik",
          LastName = "Poznanski",
          IsLecturer = true
        });
      _myCollection.Add(
        new MyData
        {
          FirstName = "John",
          LastName = "Smith",
          IsLecturer = false
        });
    }

    private int counter = 0;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
      ++counter;
      _myCollection.Add(
          new MyData()
          {
            FirstName = "item " + counter,
            LastName = "item " + counter,
            IsLecturer = counter % 3 == 0
          });
    }
  }
}

class 我的数据来自示例

public class MyData
  {
    public string User { get; set; }
    public string Password { get; set; }
  }

我做了一个符合你场景的自定义示例,看看这个。

MainWindow.xaml

<Window x:Class="SO.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
<Grid>
        <TextBlock Height="30" Text="{Binding Parent.Child.SampleText}" HorizontalAlignment="Center"/>
</Grid>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainViewModel obj = new MainViewModel();
            this.DataContext = obj; 
        }
}

MainViewModel.cs

public class MainViewModel
    {
        private ParentModel _Parent = new ParentModel();

        public ParentModel Parent
        {
            get { return _Parent; }
            set { _Parent = value; }
        }

        public MainViewModel() //Data Load in Constructor
        {
            ChildModel child = new ChildModel();
            child.SampleText = "Hi, I am Child!";
            Parent.Child = child;
        }
    }

ParentModel.cs

public class ParentModel
    {
        private ChildModel _Child = new ChildModel();

        public ChildModel Child
        {
            get { return _Child; }
            set { _Child = value; }
        }

    }

ChildModel.cs

public class ChildModel
    {
        private string _SampleText ;

        public string SampleText
        {
            get { return _SampleText; }
            set { _SampleText = value; }
        }

    }

更正你的例子: 您的视图和背后的代码是完美的。

您没有在要绑定到 UI 的模型 class 中添加属性。

class MyData
    {
        //public string User { get; set; }
        //public string Password { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public bool IsLecturer { get; set; }
    }