数据绑定组合框到应用程序配置中的连接字符串名称
本文关键字:连接 字符串 配置 组合 应用程序 数据绑定 | 更新日期: 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>