<CombobBox x:Name="cbo"
Style="{StaticResource ComboStyle1}"
DisplayMemberPath="NAME"
SelectedItem="{Binding Path=NAME}"
SelectedIndex="1">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Path=NAME}"/>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
在Window
OnLoaded
事件中,我编写了代码来设置ItemsSource
:
cbo.ItemsSource = ser.GetCity().DefaultView;
在加载窗口时,我可以看到最初第一个项目正在加载,但同时它会清除显示的项目。我陷入了这种情况,任何帮助表示赞赏。
此致
基肖尔马布
答案 0 :(得分:4)
快速解答:从代码隐藏中设置SelectedIndex = 1
。
似乎XAML中的代码首先执行(InitializeComponent()
方法),它设置SelectedIndex = 1
,但尚未指定ItemsSource
!所以SelectedIndex
不会影响! (请记住,您无法在 ItemsSource
之前指定InitializeComponent()
)
因此,您必须在设置SelectedIndex = 1
后手动设置ItemsSource
。
你应该这样做:
<强> XAML 强>
<ComboBox x:Name="cbo"
Style="{StaticResource ComboStyle1}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Path=NAME}"/>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<强>代码强>
cbo.ItemsSource = ser.GetCity().DefaultView;
cbo.SelectedIndex = 1;
或者这个:
<强> XAML 强>
<ComboBox x:Name="cbo" Initialized="cbo_Initialized"
Style="{StaticResource ComboStyle1}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Path=NAME}"/>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<强>代码强>
private void cbo_Initialized(object sender, EventArgs e)
{
cbo.SelectedIndex = 1;
}
另请注意,我已删除DisplayMemberPath="NAME"
,因为您无法同时设置DisplayMemberPath
和ItemTemplate
。此外,请使用SelectedItem
或SelectedIndex
,而不是两者。
答案 1 :(得分:2)
重置ItemsSource会搞乱选择。
此外,您还要设置SelectedItem和SelectedIndex。你只想设置其中一个;如果同时设置,则只有一个生效。
此外,您的SelectedItem声明可能是错误的。 SelectedItem="{Binding NAME}"
将查找一个项目,该项目等于环境(可能是Window级别)DataContext的NAME属性的值。仅当ComboBox.ItemsSource是字符串列表时,这才有效。由于你的ItemTemplate有效,我假设ComboBox.ItemsSource实际上是City对象的列表。但是你告诉WPF,SelectedItem应该是一个字符串(一个NAME)。此字符串永远不会等于任何City对象,因此结果将无法选择。
为了解决这个问题,在设置ItemsSource之后,根据您的要求和数据模型设置SelectedItem或SelectedIndex:
cbo.ItemsSource = ser.GetCity().DefaultView;
cbo.SelectedIndex = 1;
// or: cbo.SelectedItem = "Wellington"; // if GetCity() returns strings - probably not
// or: cbo.SelectedItem = City.Wellington; // if GetCity() returns City objects