如何从 parent class 的 itemscontrol 绑定 child class 的 属性

How to bind property of child class from itemscontrol of parent class

我有一个项目控件绑定到 parent class 的列表。 我需要在数据模板中绑定 child class 的属性。

这些是我的 class

public class Parent {

    private string _name;
     public string Name
        {
            get { return _name; }
            set
            {
                if (Equals(value, _name)) return;
                _name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
}


public class Child1 : Parent{

    private string _prob1;
     public string Prob1
        {
            get { return _prob1; }
            set
            {
                if (Equals(value, _prob1)) return;
                _prob1= value;
                OnPropertyChanged(nameof(Prob1));
            }
        }
}

public class Child2 : Parent{

    private string _prob2;
     public string Prob2
        {
            get { return _prob2; }
            set
            {
                if (Equals(value, _prob2)) return;
                _prob2= value;
                OnPropertyChanged(nameof(Prob2));
            }
        }
}

在我的视图模型中,我有一个 Parent class

的可观察集合
 public ObservableCollection<Parent> ParentList { get; set; }

和我的 xaml 代码

 <ItemsControl  ItemsSource="{Binding ParentList }">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate  
              DataType="domainObject:Child1">

<TextBlock Text="{Binding Name}" Margin="5" IsEnabled="False"  HorizontalAlignment="Center" Height="22" Background="Transparent" />

<TextBlock Text="{Binding Prob1}" Margin="5"HorizontalAlignment="Center" Height="22" />


我想将 2. 文本框绑定到 child class 的 属性。

有什么简单的方法可以解决这个问题吗?

如果 ParentList 集合包含不同派生类型(Child1 或 Child2)的元素,您应该有不同的 DataTemplate,这些模板将由 DataType 属性 自动选择。

您可以在 ItemsControl 的资源中声明这些数据模板:

<ItemsControl ItemsSource="{Binding ParentList}">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type domainObject:Child1}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" ... />
                <TextBlock Text="{Binding Prob1}" ... />
            </StackPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type domainObject:Child2}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" ... />
                <TextBlock Text="{Binding Prob2}" ... />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>