我正在构建一个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;
}
}
}
}
所有这些让我到达了我需要的地方。
答案 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>