为什么这个WPF ComboBox没有显示所选值?

时间:2010-01-22 05:31:30

标签: wpf combobox datatemplate selectedvalue

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

在加载窗口时,我可以看到最初第一个项目正在加载,但同时它会清除显示的项目。我陷入了这种情况,任何帮助表示赞赏。

此致

基肖尔马布

2 个答案:

答案 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",因为您无法同时设置DisplayMemberPathItemTemplate。此外,请使用SelectedItemSelectedIndex,而不是两者。

答案 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