将 UserControl ListBox ItemSsource 绑定到父 DataContext 时出错

Posted

技术标签:

【中文标题】将 UserControl ListBox ItemSsource 绑定到父 DataContext 时出错【英文标题】:Error on binding UserControl's ListBox's ItemSource to parent DataContext 【发布时间】:2015-08-24 22:28:08 【问题描述】:

我正在尝试将 UserControl 的 ListBox 绑定到父 ViewModel 的公共列表。 这里我将DataContext设置为主窗口

public partial class MainWindow : Window

    private ConfigurationListViewModel _ConfList = new ConfigurationListViewModel();
    public MainWindow()
    
        InitializeComponent();
        DataContext = _ConfList.ConfList;
    

班级是:

public class ConfigurationListViewModel

    public ConfigurationList ConfList = new ConfigurationList();


public class ConfigurationList

    public List<string> Test = new List<string>();

    public ConfigurationList()
    
        Test.Add("aaa");
        Test.Add("bbb");
        Test.Add("ccc");
    
 

在主窗口 XAML 中,我设置了用户控件:

<GroupBox Header="Configurations" >
    <local:ConfigurationMng x:Name="ConfigMng"/>
</GroupBox>

在 ConfigurationMng 中,我有以下 ListBox,我正在尝试将其绑定到列表“Test”。

&lt;ListBox Name="lbConfigurationList" ItemsSource="Binding Test"&gt;

由于MainWindow有_ConfList.ConfList的DataContext,我认为ListBox有List“Test”的范围; 但使用记录器我得到以下输出:

System.Windows.Data Error: 40 : BindingExpression path error: 'Test' property not found on 'object' ''ConfigurationList' (HashCode=43536272)'. BindingExpression:Path=Test; DataItem='ConfigurationList' (HashCode=43536272); target element is 'ListBox' (Name='lbConfigurationList'); target property is 'ItemsSource' (type 'IEnumerable')

但我不明白这背后有什么错误。

我错过了什么?

【问题讨论】:

【参考方案1】:

ConfigurationList 类中的Test 不是属性,而是字段。您只能绑定到公共属性

只需将初始化行改为:

public List<String> Test get; set; = new List<string>();

请注意,自动属性初始化器是 C# 6 中的新功能。如果您使用的是该语言的早期版本,则必须使用支持字段或在构造函数中设置它。

【讨论】:

以上是关于将 UserControl ListBox ItemSsource 绑定到父 DataContext 时出错的主要内容,如果未能解决你的问题,请参考以下文章

实现点击Form区域内除ListBox以外的其他地方,实现ListBox的隐藏,包括UserControl范围内,也包括UserControl之外Form之内

如何为ListBox的每个项添加“删除”按钮并实现其功能?

使用 MVVM 时,绑定不适用于 ListBox

WPF中ListBox的绑定

WPF中列表框项的自定义工具提示

WPF 从后面的代码添加的 UserControl 绑定到祖先