如何将ItemsSource绑定到DataTemplate中的ComboBox

时间:2019-08-02 13:31:50

标签: c# .net wpf xaml

绑定到列表的

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

1 个答案:

答案 0 :(得分:0)

在数据模板中创建控件时,控件的datacontext不使用窗口的上下文,而是使用模板所使用的控件的上下文。 因此,当您的列表框显示ListEntitys列表时,组合框将尝试从每个ListEntity中获取ItemsList属性-不存在

解决此问题的一种方法是使您的组合框使用窗口上下文:

ItemsSource="{Binding Path=DataContext.ItemsList, RelativeSource={RelativeSource AncestorType=Window}}"