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>

Window OnLoaded事件中,我编写了代码来设置ItemsSource

cbo.ItemsSource = ser.GetCity().DefaultView;

在加载窗口时,我可以看到最初第一个项目正在加载,但同时它清除了显示的项目。我被困在这种情况下,感谢任何帮助。

问候

基肖尔

4

2 回答 2

5

重置 ItemsSource 会打乱选择。

此外,您正在设置 SelectedItem 和 SelectedIndex。您只想设置其中之一;如果两者都设置,则只有一个会生效。

此外,您的 SelectedItem 声明可能是错误的。 SelectedItem="{Binding NAME}"将查找等于环境(可能是窗口级别)DataContext 的 NAME 属性值的项。这仅在 ComboBox.ItemsSource 是字符串列表时才有效。由于您的 ItemTemplate 有效,我假设 ComboBox.ItemsSource 实际上是 City 对象的列表。但是您告诉 WPF SelectedItem 应该是一个字符串(一个名称)。此字符串永远不会等于任何 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
于 2010-01-22T06:29:30.497 回答
5

快速回答: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。而且,使用其中一个SelectedItemSelectedIndex,而不是两者。

于 2010-01-22T08:07:29.547 回答