Почему этот WPF ComboBox не показывает выбранное значение? - PullRequest
0 голосов
/ 22 января 2010
<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 ]

4 голосов
/ 22 января 2010

БЫСТРЫЙ ОТВЕТ: Установите 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, но не оба.

2 голосов
/ 22 января 2010

Сброс ItemSource испортит выбор.

Кроме того, вы устанавливаете SelectedItem и SelectedIndex. Вы хотите установить только один из них; если вы установите оба, только один из них вступит в силу.

Кроме того, ваше объявление SelectedItem, вероятно, неверно. SelectedItem="{Binding NAME}" будет искать элемент, который равен значению свойства NAME окружающего (возможно, уровня окна) DataContext. Это будет работать, только если 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
...