从继承的数据上下文将元素绑定到属性

时间:2015-05-13 16:30:04

标签: c# wpf xaml combobox

我有一个WPF控制窗格,其中包含16个相同的子控件,其中包含需要绑定到后面的父控件代码中的列表的组合框。在找到这个列表之前,我真的很难让这个列表绑定:Binding objects defined in code-behind

在父控件上设置DataContext="{Binding RelativeSource={RelativeSource Self}}"允许我直接绑定子控件上的组合框。

问题是,现在我想创建一个数据模板来正确显示列表项,但是我在Binding或Relative Source中没有任何内容显示任何内容。

ControlPane.xaml

<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         x:Class="ControlPane"
         x:Name="CtrlPaneWpf"
         DataContext="{Binding RelativeSource={RelativeSource Self}}"
         > 

ControlPane.xaml.cs

public class TwoStringClass
{
    public string string1;
    public string colorHex;
}

public ObservableCollection<TwoStringClass> TwoStringClass1
{
    get
    {
        ObservableCollection<TwoStringClass> cmbclrs = new ObservableCollection<TwoStringClass>();
        cmbclrs.Add(new TwoStringClass() { string1 = "This", colorHex = "#FF0000" });
        cmbclrs.Add(new TwoStringClass() { string1 = "That", colorHex = "#FF352E2"  });
        cmbclrs.Add(new TwoStringClass() { string1 = "The Other", colorHex = "#FFF4F612"  });
        return cmbclrs;
    }    
}

ChildControl.xaml

<UserControl
            x:Name="ChildControl"
            >
            <ComboBox x:Name="cmbFontColor" ItemsSource="{Binding TwoStringClass1}" >
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding string1}"  />
                            <Rectangle Fill="{Binding colorHex}" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
</UserControl>

我知道Binding正在工作,因为我在Combobox中获得了正确数量的(空白)项目,并且如果我删除了ItemTemplate,则可以看到类名称。

我无法弄清楚为什么绑定到属性名称在这里不起作用,因为当列表来自控件自己的代码时,它会发生。

我需要将一些其他信息添加到TextBlock绑定中,但无论我尝试使用哪种DataContext或RelativeSource,我总是会得到空白项。

2 个答案:

答案 0 :(得分:1)

WPF中的数据绑定仅适用于公共属性,而不适用于字段。您的项目类应如下所示:

public class TwoStringClass
{
    public string string1 { get; set; }
    public string colorHex { get; set; }
}

也就是说,有广泛接受的命名约定,根据该约定,您应该使用Pascal case作为属性名称,例如String1ColorHex

答案 1 :(得分:0)

我相信你问题的答案与我最近发布的问题的答案相同,StewBob已经回答了这个问题。这是我的答案的略微修改版本,它也应该解决你遇到的问题。

您可以在此处查看我的原始帖子:WPF ListBox with CheckBox data template - Binding Content property of Checkbox not working

我看到你添加了&#34;这&#34;,&#34;那&#34;和&#34;其他&#34;作为您的数据源,大概是为了简单地将此问题发布到SO。请注意,如果真正的基础数据源可以更改,则在执行DataBinding时,您的类需要实现INotifyPropertyChanged以使数据在UI中正确显示。一个例子:

public class TwoStringClass: INotifyPropertyChanged
{

  private string _String1;
  private string _ColorHex;

  public string String1
  {
    get
    {
      return _String1;
    }
    set
    {
      if (value != _String1)
      {
        _String1 = value;
        NotifyPropertyChanged("String1");
      }
    }
  }

  public string ColorHex
  {
    get
    {
      return _ColorHex;
    }
    set
    {
      if (value != _ColorHex)
      {
        _ColorHex = value;
        NotifyPropertyChanged("ColorHex");
      }
    }
  }

  private void NotifyPropertyChanged(string info)
  {
    if (PropertyChanged != null)
    {
      PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

这显示了实现INotifyPropertyChanged的类,两个属性以及所需的事件和方法。