【问题标题】:How to bind property of child class from itemscontrol of parent class如何从父类的itemscontrol绑定子类的属性
【发布时间】:2019-09-10 09:19:52
【问题描述】:

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

这些是我的课程

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));
            }
        }
}

在我的视图模型中,我有一个可观察的父类集合

 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. 文本框绑定到子类的属性。

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

【问题讨论】:

  • 从您在此处显示的内容来看,您的 Parent、Child1 和 Child2 类之间没有任何关系。那你到底在问什么?如果 Child1 将 派生 来自 Parent,则您的 XAML 将按原样工作。请注意,设置明确用作 ItemsControl 的 ItemTemplate 的 DataTemplate 的 DataType 属性是没有意义的。
  • 对不起,我忘了加“:父母”。文本块不包含任何值,我认为绑定有问题?
  • 请看答案。请注意,父/子关系通常由组合而非继承建模。换句话说,基类(或超类)通常不称为父类。

标签: c# wpf parent-child datatemplate itemscontrol


【解决方案1】:

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

您可以在 ItemsControl 的资源中声明这些 DataTemplate:

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多