数据绑定组合框到应用程序配置中的连接字符串名称

本文关键字:连接 字符串 配置 组合 应用程序 数据绑定 | 更新日期: 2023-09-27 18:34:54

我正在构建一个 WPF 应用程序,其中包含在 app.config 文件中加载的一堆连接字符串。我试图做的是让 WPF 窗口的组合框显示连接字符串的名称,而不必将这些名称添加到应用程序设置中。这可能吗?

在 MainWindow.xaml 中:

<ComboBox Grid.Row="0" Grid.Column="1"
          Name="Servers"
          ItemsSource="{Binding ?app.config?}" />

在应用程序配置中:

<connectionStrings>
  <add name="Prod" connectionString="Data source=..." />
  <add name="Test" connectionString="Data source=..."/>
</connectionStrings>

编辑:

这是我使用的最后一个过程:

在我的窗口标签中:

xmlns:m="clr-namespace:SqlWindow"
<Window.DataContext>
    <m:MainWindowViewModel />
</Window.DataContext>

然后,在主窗口 XAML 中,我有:

    <ComboBox Grid.Row="0" Grid.Column="1" Name="ServersComboBox"
              ItemsSource="{Binding ConnectionStrings}"
              DisplayMemberPath="Name"
              SelectedIndex="0" />

在单独的课程中,我有:

public class MainWindowViewModel {
    public IEnumerable<ConnectionStringSettings> ConnectionStrings {
        get {
            foreach (ConnectionStringSettings cn in ConfigurationManager.ConnectionStrings) {
                yield return cn;
            }
        }
    }
}

所有这些都让我到达了我需要去的地方。

数据绑定组合框到应用程序配置中的连接字符串名称

您应该为连接创建一个支持属性,该属性将从ConfigurationManager.Connections 获得。然后将其绑定到Combobox

public IEnumerable Connections
{
   get
   {
       return ConfigurationManager.ConnectionStrings;
   }
}

剩下最后一件事是显示正确的连接名称。为此,您必须指定DisplayMemberPath

<ComboBox Grid.Row="0" Grid.Column="1"
          Name="Servers"
          DisplayMemberPath="Name"
          ItemsSource="{Binding Connections}">
</Combobox>


这是如何工作的?

Combobox ItemsSource属性是IEnumerable,它允许获取列表中每个项目的DataContext。如果您没有明确指定DataTemplate - 它将尝试将其(上下文(转换为字符串。对于ConnectionStringSettings班来说,这不是我们真正想看到的。因此,我们需要明确定义模板的外观。
最简单的方法是在DisplayMemberPath中设置属性的名称。您还可以覆盖DataTemplate这对非平凡的情况有好处。

如果您没有使用 MVVM 模式或任何特定对象进行绑定,则可以执行以下操作:

在窗口开头的代码中,以这种方式设置 DataContext 属性

public MainWindow()
{
  InitializeComponent();
  var connections = System.Configuration.ConfigurationManager.ConnectionStrings;
  DataContext=connections;
}

然后,在您的窗口中执行以下操作:

 <ComboBox Grid.Row="0" Grid.Column="1"
      Name="Servers"
      ItemsSource="{Binding}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>