WPF Combobox меняет источник через SelectedValue при загрузке ItemsSource - PullRequest
2 голосов
/ 12 июля 2011

У меня есть этот комбинированный список в моем окне WPF.

<ComboBox DisplayMemberPath="Description" SelectedValuePath="ID" ItemsSource="{Binding Source={StaticResource CvsPrinters}}" SelectedValue="{Binding CheckPrinterID}" />

Моя проблема заключается в том, что при загрузке окна привязка SelectedValue заставляет мои исходные данные перейти на первый элемент в ItemsSource вместо того, чтобы устанавливать SelectedValue Combobox на соответствующий элемент в ItemsSource.

CheckPrinterID взят из текстового контекста выбора списка, и эта проблема возникает только с элементом, изначально выбранным в этом списке при загрузке. Когда я выбираю другой элемент в списке, выпадающий список правильно выбирает нужный элемент, и все в порядке, но, к сожалению, мой начальный элемент был обновлен и теперь неверен.

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Я полагаю, вы пытаетесь синхронизировать ListView и ComboBox через общее свойство.Попробуйте установить IsSynchronizedWithCurrentItem в True в ListView и убедиться, что SelectedItem или SelectedIndex для ListView установлено во время загрузки.

0 голосов
/ 13 июля 2011

Если у вас есть некоторая гибкость в объекте DataContext, вы можете попробовать изменить выбранное свойство CheckPrinter на тип объекта данных вместо идентификатора и переключиться на использование SelectedItem вместо SelectedValue (по какой-то причине SelectedValue ведет себя по-разному, особенно на начальном этапе. загрузить), а затем извлечь идентификатор из этого значения в коде.

Если по какой-либо причине вы не можете использовать объекты CheckPrinter в своем объекте DataContext, вы также можете пойти в противоположном направлении на стороне пользовательского интерфейса, используя список идентификаторов в качестве ItemsSource и снова используя SelectedItem. Чтобы получить список, показывающий, что вы хотите в ComboBoxItems, вам потребуется использовать IValueConverter для извлечения значений Description на основе идентификаторов:

<ComboBox ItemsSource="{Binding Source={StaticResource CvsPrinterIds}}" SelectedItem="{Binding CheckPrinterID}" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock >
                <TextBlock.Text>
                    <Binding>
                        <Binding.Converter>
                            <local:MyDescriptionLookupConverter Printers="{StaticResource CvsPrinters}"/>
                        </Binding.Converter>
                    </Binding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

и простой конвертер для поиска ID-описания (добавьте несколько проверок null и cast):

    public class MyDescriptionLookupConverter : IValueConverter
    {
        public IEnumerable<Printer> Printers { get; set; }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Printers.First(p => p.Id == (int)value).Description;
        }
        ...
    }
0 голосов
/ 12 июля 2011

Попробуйте переупорядочить ItemsSource перед DisplayMemberPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...