我有这个组合框
<ComboBox Height="30" SelectedIndex="0" Margin="5 3 5 3" Width="170" ItemsSource="{Binding WonderList}" SelectedValuePath="selectedWonder">
<ComboBox.ItemTemplate>
<DataTemplate>
<WrapPanel>
<Image Source="{Binding Path}" Height="20"></Image>
<Label Content="{Binding Name}" Style="{StaticResource LabelComboItem}"></Label>
</WrapPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我希望将项目显示为图像和文本。
这是项目列表
中对象的业务类public class Wonder: INotifyPropertyChanged
{
private string name;
private string path;
public event PropertyChangedEventHandler PropertyChanged;
#region properties, getters and setters
public String Name { get; set; }
public String Path { get; set; }
#endregion
public Wonder(string name, string path)
{
this.name = name;
this.path = path;
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
以及窗口背后的代码
public class Window1 {
public List<Wonder> WonderList;
public Window1()
{
InitializeComponent();
WonderList = new List<Wonder>();
WonderList.Add(new Wonder("Alexandria", "Resources/Images/Scans/Wonders/Alexandria.jpg"));
WonderList.Add(new Wonder("Babylon", "Resources/Images/Scans/Wonders/Babylon.jpg"));
}
}
我对这个xaml“魔法”很陌生并猜测我没有正确理解数据绑定是如何工作的,我认为对于ItemsSource="{Binding WonderList}"
它应该采用具有该名称的集合(来自后面的代码)和显示他们的名称和路径,但它显示一个空列表。
如果我在后面的代码中Combo1.ItemsSource = WonderList;
(我更喜欢使用xaml并避免代码隐藏),它会显示两个空白插槽,但仍然不知道如何显示这些项目。
由于
答案 0 :(得分:2)
如果您想像ItemsSource="{Binding WonderList}"
那样绑定,则必须先设置DataContext
。
public Window1()
{
...
this.DataContext = this;
}
然后Binding将在Window1中找到WonderList,但前提是它也是属性。
public List<Wonder> WonderList { get; private set; }
下一步:如果将值分配给私有字段名称,则绑定到属性Name是没用的。用
替换构造函数public Wonder(string name, string path)
{
this.Name = name;
this.Path = path;
}
下一步:您的自动属性({ get; set; }
)不会通知更改。为此,您必须在setter中调用OnPropertyChanged
。 e.g。
public String Name
{
get { return name; }
set
{
if (name == value) return;
name = value;
OnPropertyChanged("Name");
}
}
WonderList也是如此。如果你在构造函数中创建List to late,那么所有绑定都已经解决,你什么都看不到。
最后使用ObservableCollection
,如果您想要通知新列表,而不是列表中新添加的项目。
答案 1 :(得分:0)
你没有做正确的方法。简单地说,你应该有一个Wonders类,它包含一个ObservableCollection属性,该属性绑定到ComboBox的ItemsSource。你应该阅读MSDN: