数据绑定ComboBox到App.Config中的连接字符串名称

时间:2014-12-22 17:47:25

标签: c# wpf xaml data-binding app-config

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

在MainWindow.xaml:

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

在App.config中:

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

编辑:

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

在我的Window标签中:

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

}

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

2 个答案:

答案 0 :(得分:1)

您应该为{em> Connections 创建一个支持属性,您将从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>

<小时/> 这是如何运作的?

ItemsSource的{​​{1}}属性为Combobox,允许为列表中的每个项目获取IEnumerable。如果您没有明确指定DataContext,它会尝试将其(上下文)强制转换为字符串。对于DataTemplate课程,这不是我们真正想要看到的内容。所以我们需要明确定义模板的外观。
最简单的方法是在ConnectionStringSettings中设置属性的名称。您也可以覆盖DisplayMemberPath,这对于非平凡的情况非常有用。

答案 1 :(得分:0)

如果您没有使用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>