【问题标题】:Binding WPF combo box to specific dictionary instance将 WPF 组合框绑定到特定的字典实例
【发布时间】:2026-01-21 20:00:01
【问题描述】:

我是 WPF 新手,我正在尝试让数据绑定与组合框一起使用。我创建了一个名为 FolderList 的类,它基本上围绕 FileSystemWatcher 实例。它有一个名为 Folders 的属性,该属性返回文件夹名称及其完整路径的字典。

然后,对于我的 WPF 窗口的类,它包含一个名为 FolderWatcher 的 FolderList 实例,该实例在构造函数中配置。我想将一个组合框数据绑定到该特定文件夹列表实例中的字典。

我找到了一些示例,其中存在数据对象的静态实例,或者它们是通过 XAML 创建的,但我不知道如何绑定到特定实例。

我不会选择这是在 XAML 还是 C# 中完成的。我基本上已经使用 ObjectDataProvider 做到了这一点。

<Window.Resources>
<ObjectDataProvider x:Key="ProjectNames"
        ObjectType="{x:Type local:FolderList}"
    />
</Window.Resources>

这是我要数据绑定的组合框。这不会产生任何错误,但也不会填充。我知道我在 ObjectDataProvider 中遗漏了一些重要的东西,但我只是不知道它是什么。

<ComboBox Name="ProjectCombo" MinWidth="100" ItemsSource="{Binding Source={StaticResource ProjectNames}, Path=Folders}" />

【问题讨论】:

    标签: c# wpf data-binding dictionary combobox


    【解决方案1】:

    这里不需要ObjectDataProvider。只需在Window 的构造函数中直接设置ComboBoxItemsSource,在其中初始化FolderList 的实例:

    public MyWindow()
    {
       InitializeComponent();
    
       FolderWatcher = new FolderList(...);
    
       ProjectCombo.ItemsSource = FolderWatcher.Folders;
    }
    

    另一种选择是将FolderList 的实例设置为窗口的DataContext,然后使用绑定设置ItemsSource of theComboBox`:

    public MyWindow()
    {
        InitializeComponent();
    
        FolderWatcher = new FolderList(...);
    
        DataContext = FolderWatcher;
    

    }

    <ComboBox Name="ProjectCombo" MinWidth="100" ItemsSource="{Binding Folders}" />
    

    我建议您查看MVVM pattern。如果您根据该模式设计应用程序,您将拥有一个 View Model 实例作为您的视图的DataContext,并且该 View Model 将公开一个您可以绑定到的属性。

    【讨论】: