为什么这个WPF下拉框没有显示选中的值?

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

WindowOnLoaded事件中,我编写了代码来设置ItemsSource
cbo.ItemsSource = ser.GetCity().DefaultView;

在加载窗口时,我可以看到最初第一个项目正在加载,但同时它清除了显示的项目。我陷入了这种情况,任何帮助都将不胜感激。
此致
敬礼
Kishore
2个回答

5
重置ItemsSource将会破坏选择。
此外,您正在同时设置SelectedItem和SelectedIndex。您只想设置其中一个;如果同时设置两个,只有一个会生效。
另外,您的SelectedItem声明可能是错误的。SelectedItem="{Binding NAME}"将查找一个项,该项等于环境(可能是窗口级别)DataContext的NAME属性的值。这仅在ComboBox.ItemsSource是字符串列表时才有效。由于您的ItemTemplate起作用,我假设ComboBox.ItemsSource实际上是City对象的列表。但是,您告诉WPF所选的项应该是一个字符串(即名称)。这个字符串永远不会等于任何城市对象,因此结果将是没有选择。
因此,在设置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

2
+1 重置 ItemsSource 将会破坏选择。我正在刷新我的 ItemsSource,这导致了绑定出现问题。 - Jason Massey

5

快速回答:在代码后端设置SelectedIndex = 1

似乎XAML中的代码先执行(InitializeComponent()方法),这会设置SelectedIndex = 1,但是ItemsSource尚未指定!因此SelectedIndex不会生效!(请记住,在InitializeComponent()之前无法指定ItemsSource

因此,您必须在设置ItemsSource后手动设置SelectedIndex = 1


您应该像这样操作:

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;

Or this:

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中的一个,而不是两者都使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接