我有一个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,我总是会得到空白项。
答案 0 :(得分:1)
WPF中的数据绑定仅适用于公共属性,而不适用于字段。您的项目类应如下所示:
public class TwoStringClass
{
public string string1 { get; set; }
public string colorHex { get; set; }
}
也就是说,有广泛接受的命名约定,根据该约定,您应该使用Pascal case作为属性名称,例如String1
和ColorHex
。
答案 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的类,两个属性以及所需的事件和方法。