ItemsSource似乎工作正常,除了在DataTemplate内部时。 我现在有3个ComboBoxes:2个位于DataTemplate内,其中一个具有可工作的硬编码项目,另一个具有已设置的ItemsSource无效的项目。最后一个在DataTemplate外部,并且正在使用ItemsSource。 2 lists of ComboBoxes and 1 ComboBox
我试图修改DataContext,RelativeSource和ElementName,但是没有任何运气。
ItemsSource列表包含ListEntry
public class ListEntry : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string m_name;
private string m_desc;
public ListEntry(string name, string desc)
{
Name = name;
Desc = desc;
}
public string Name
{
get { return m_name; }
set { m_name = value; NotifyPropertyChanged("Name"); }
}
public string Desc
{
get { return m_desc; }
set { m_desc = value; NotifyPropertyChanged("Desc"); }
}
}
这是我的DataContext
public class DataClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private ObservableCollection<ListEntry> m_itemsList;
public ObservableCollection<ListEntry> ItemsList
{
get { return m_itemsList; }
set { m_itemsList = value; NotifyPropertyChanged("ItemsList"); }
}
}
这是带有ItemsSource的组合框
XAML
<Window.Resources>
<DataTemplate x:Key="DataTempItemsSource">
<ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" ItemsSource="{Binding ItemsList}" DisplayMemberPath="Name"
SelectedValuePath="Name" SelectedIndex="0"/>
</DataTemplate>
<ListBox HorizontalAlignment="Center"
VerticalAlignment="Center"
ItemTemplate="{StaticResource DataTempItemsSource}"
ItemsSource="{Binding ItemsList}">
</ListBox>
这是带有硬编码值的ComboBox,可以正常工作
XAML
<DataTemplate x:Key="DataTempHardCode">
<ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" SelectedIndex="0">
<ComboBoxItem Content="One"/>
<ComboBoxItem Content="Two"/>
</ComboBox>
</DataTemplate>
<ListBox HorizontalAlignment="Center"
VerticalAlignment="Center"
ItemTemplate="{StaticResource DataTempHardCode}"
ItemsSource="{Binding ItemsList}">
</ListBox>
我还确认了带有ItemsSource的ComboBox在DataTemplate外部正常工作。
<ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" ItemsSource="{Binding ItemsList}" DisplayMemberPath="Name"
SelectedValuePath="Name" SelectedIndex="0"/>
我遇到了两个错误: System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“ ListEntry”(HashCode = 20917673)“上找不到“ ItemsList”属性。 BindingExpression:Path = ItemsList; DataItem ='ListEntry'(HashCode = 20917673);目标元素是'ComboBox'(Name ='');目标属性为“ ItemsSource”(类型为“ IEnumerable”)
System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“ ListEntry”(HashCode = 52252659)上找不到“ ItemsList”属性。 BindingExpression:Path = ItemsList; DataItem ='ListEntry'(HashCode = 52252659);目标元素是'ComboBox'(Name ='');目标属性为“ ItemsSource”(类型为“ IEnumerable”)
任何想法有什么问题吗?我的其他绑定正在工作,所以我不认为DataContext是错误的(它在MainWindow.cs文件中设置:DataContext = this.dataClass;)
答案 0 :(得分:0)
在数据模板中创建控件时,控件的datacontext不使用窗口的上下文,而是使用模板所使用的控件的上下文。 因此,当您的列表框显示ListEntitys列表时,组合框将尝试从每个ListEntity中获取ItemsList属性-不存在
解决此问题的一种方法是使您的组合框使用窗口上下文:
ItemsSource="{Binding Path=DataContext.ItemsList, RelativeSource={RelativeSource AncestorType=Window}}"