【问题标题】:Data Binding ComboBox to Connection String names in App.Config将 ComboBox 数据绑定到 App.Config 中的连接字符串名称
【发布时间】:2015-02-20 20:29:27
【问题描述】:

我正在构建一个 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>

编辑:

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

在我的窗口标签中:

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

}

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

【问题讨论】:

  • 那么您是否建议将连接字符串存储在数据库中并以这种方式检索它们..?将它们存储在 app.config 文件中有什么问题..?您也可以将它们存储在 Setting.Settings 中,但您仍然需要手动输入值。您可以创建一个 List 并将值添加到列表中,然后将 ComboBox 绑定到该 List例如有几种方法可以解决这个问题
  • 不,我要把它们放在 app.config 中。我正在尝试将组合框的 itemssource 绑定到连接字符串的 name 属性。所以从上面的例子来看,组合框的项目应该是“Prod”和“Text”。
  • 根据我之前的建议试试看这里stackoverflow.com/questions/845030/…
  • 我知道我可以通过应用程序设置来做到这一点。这是我试图避免的方法,因为那样我就必须在 app.config 和应用程序设置中加载连接字符串 namnes。我正在努力避免重复劳动。

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


【解决方案1】:

您应该为您将从ConfigurationManager.Connections 获得的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>


这是如何工作的?

ItemsSourceCombobox 属性是IEnumerable,它允许为列表中的每个项目获取DataContext。如果您没有明确指定DataTemplate - 它会尝试将它(上下文)转换为字符串。对于ConnectionStringSettings 类,这不是我们真正想看到的。所以我们需要明确定义模板应该是什么样子。
最简单的方法是在DisplayMemberPath 中设置属性名称。您还可以覆盖DataTemplate,这对于非平凡的情况很有用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我知道该怎么做,但是如何将 XAML 中的 ConnectionString Name 属性绑定到 ComboBox ItemsSource?这就是我所追求的。
    • 你是使用 MVVM 模式还是只是在代码开始时设置窗口数据上下文?
    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2018-10-18
    • 2023-04-04
    相关资源
    最近更新 更多