这段时间一直在进行WPF的开发,研究了ComboBox这个控件2天,发现了很多细节,这里分享给大家,也做一个自己的备忘。
这里主要对ComboBox这个控件对于绑定dictionary所用到的属性的设置问题。
先上Xaml代码:
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<TextBlock Width="95" HorizontalAlignment="Center" Margin="5" FontSize="13" Foreground="#FF7092BE">型号</TextBlock>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding Path=G_TypeNameDicNoStr}"></TextBlock>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<ComboBox Name="CB_GunTypeName" ItemsSource="{Binding Path=GunNameTypeDic}" DisplayMemberPath="Value" SelectedItem="{Binding Path=G_TypeNameDicNoStr}" FocusVisualStyle="{x:Null}"></ComboBox>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
这里先介绍下这段代码背景,方便大家研究。
我将ComboBox写在了一个DataGridTemplateColumn中,作为DataGrid的一列。我的目的很简单,就是想要从数据库获取枪支名称字典Dictionary,也就是GunNameTypeDic。
用户在使用的时候,可以动态的增加数据库中Dictionary表中的值,这样,这个ComboBox就可以增加选项。
然后,在查找了很多资料以后,网上大多都是ComboBox绑定对象,枚举等。所以,在实现的时候遇到了很多困难,网上都没法解决。
这里分享给大家解决方法:
主要是在xaml中 ComboBox控件的几个重要的属性:
1.ItemsSource 这个属性直接关系到会在ComboBox中显示的下拉菜单所指定的内容。比如,这里我就是指定了一个Dictionary对象。让ComboBox显示Dictionary中的内容。
2.DisplayMemberPath 这个属性是指定ItemsSource中想要具体呈现到界面的内容。比如,这里我指定为“Value”。因为ComboBox的ItemsSource绑定的是一个Dictionary对象,其中包含很多键值对(KeyValuePair),KeyValuePair含有Key和Value属性,我这里是Dictionary<int, string>,所以我想要显示string的内容,就应该把DisplayMemberPath 写成Value。说个题外话,如果ItemsSource绑定的是一个某种对象的集合,那么这个DisplayMemberPath指定的是这个对象下的某个属性。
3.SelectedItem 这个属性。我尝试了用SelectedValue和这个属性互换,在后台cs代码中没有发现什么异同。这里如果有知道详细区别的同学可以交流交流。这里我使用SelectedItem绑定了后台对象的某个string类型的属性。它的作用是当用户选择了ComboBox以后,会将选择的string内容写入到对象实际的值。
下面是后台cs代码:
private int g_TypeNameDicNo; //枪型号名
public int G_TypeNameDicNo
{
get {
return g_TypeNameDicNo;
}
set {
g_TypeNameDicNo = value;
}
}
public string G_TypeNameDicNoStr
{
get
{
return gunNameTypeDic[g_TypeNameDicNo]; //查找Dictionary返回它的Value
}
set
{
int selectedIndex = 0;
foreach (KeyValuePair<int, string> pair in gunNameTypeDic)
{
if (pair.ToString().Equals(value)) //对比键值对
{
selectedIndex = pair.Key;
}
}
G_TypeNameDicNo = selectedIndex;
}
}
private Dictionary<int, string> gunNameTypeDic;
public Dictionary<int, string> GunNameTypeDic
{
get {
return gunNameTypeDic;
}
}