Как связать текст выпадающего списка с устаревшими данными, отсутствующими в раскрывающемся списке? - PullRequest
2 голосов
/ 11 июля 2011

Выпадающий список (itemssource) моего списка содержит новые элементы запроса продукта. Я хочу привязать к устаревшим данным, которых нет в раскрывающемся списке. Чтобы усложнить задачу, я использую мультисвязывание с IMultiValueConverter для объединения полей для отображения. Кроме того, имена связанных полей не совпадают с именами свойств, с которыми я связан.

Источник элемента комбинированного списка - это список запросов NewProduct. Из этого NPR объекта NewProdNumber и NewProdName объединяются для отображения в раскрывающемся списке моим конвертером типов. Метод ConvertBack возвращает значения NewProdNumber и NewProdNumberCombinedWithName. Эти два значения будут сохранены в полях базы данных с немного разными именами. Для этого примера я назову их DBProdRequestNumber и DBProdRequestTitle.

Мне удалось отобразить и сохранить новые предметы. Проблема в том, что я не понял, как отобразить устаревшие данные, которых нет в списке . Его нет в списке, поскольку он больше не квалифицируется как новый запрос продукта.

Вот проблема XAML (источник данных установлен в коде позади):

<ComboBox x:Name="NPRComboBox" IsSynchronizedWithCurrentItem="False" IsEditable="False">
    <ComboBox.SelectedItem>
        <MultiBinding Converter="{StaticResource combineNPRStuffMultiConverter}">
            <Binding Path="DBProdRequestNumber" UpdateSourceTrigger="PropertyChanged"/>
            <Binding Path="DBProdRequestTitle" UpdateSourceTrigger="PropertyChanged"/>
        </MultiBinding>
    </ComboBox.SelectedItem>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock DataContext="{Binding}">
                <TextBlock.Text>
                    <MultiBinding  Converter="{StaticResource combineNPRStuffMultiConverter}">                             
                        <Binding Path="NewProdNumber" UpdateSourceTrigger="PropertyChanged"/>                              
                        <Binding Path="NewProdNumberCombinedWithName" UpdateSourceTrigger="PropertyChanged"/>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Подобную проблему с сеткой данных и списком я решил, используя DataGridTemplateColumn.CellEditingTemplate на основе этого примера MSDN Magazine от Джули Лерман. Конечно, в этом случае я не использую сетку данных.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 мая 2012

Этот ответ (на мой собственный вопрос) был взят из комментария в ответе NathanAW:

К сожалению, я не могу включить устаревшие элементы в ItemsSource.Список от веб-службы, которая находится вне моего контроля.Я разработал хитрое решение, которое мне не очень нравится (но оно работает) ... Так как я знаю, что выпадающий список необходим только для новых записей, он виден только тогда, когда пользователь нажимает «Добавить».В том же месте я поместил текстовое поле, привязанное к устаревшим данным, которое отображается, когда НЕ в режиме добавления.Итак, я переключаю видимость каждого элемента управления, когда приложение входит и выходит из режима добавления.Я уверен, что есть лучший способ!

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

Кажется, что вы могли бы упростить это, не используя конвертер Multi-Binding. Если у вас есть коллекция объектов NPR, вы можете установить ее в качестве ItemsSource для списка. Затем используйте DataTemplate для форматирования того, как вы хотите, чтобы этот элемент отображался.

С помощью этой настройки вы можете создать шаблон, который показывает несколько полей из объекта NPR в одном TextBlock, используя что-то вроде:

<ComboBox 
    x:Name="NPRComboBox" 
    IsSynchronizedWithCurrentItem="False" 
    IsEditable="False" 
    SelectedItem={Binding SelectedNPR, Mode=TwoWay}" 
>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
               <Run Text="{Binding Path=NewProdNumber, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
               <Run> - </Run>
               <Run Text="{Binding Path=NewProdNumberCombinedWithName, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Если у вас есть дополнительные свойства для объекта NPR, к которым вы хотите получить доступ, вы можете добавить в шаблон дополнительный раздел.

Обратите внимание, что «выбранный» элемент привязан к свойству ViewModel (или коду с выделенным кодом, или к чему-либо еще). Это было бы что-то вроде:

public NPR SelectedNPR
{
   get { ... }
   set 
   {
       ...
       // don't forget INotifyPropertyChanged
       ...
   }
}

EDIT

Вот пример, который, кажется, выполняет то, что вы указали при отображении устаревших данных в «SelectionBox», но не в выпадающем списке. Чтобы проверить это, попробуйте запустить его в KaXaml или что-то в этом роде. Затем начните вводить «Hello 3» и увидите, что он предлагает «Hello 30». Это указывает на то, что Combo знает об элементе. Теперь опустите список вниз и увидите, что его нет в списке. Если вы нажимаете клавишу со стрелкой вниз, она переходит от «Hello 20» к «Hello 40».

Следующим шагом будет настройка шаблонов таким образом, чтобы видимость шаблона ListBoxItem была привязана к «IsLegacy» в вашем объекте NPR. Затем добавьте как старые, так и новые элементы в коллекцию ItemsSource и привяжите их к списку.

<ComboBox IsEditable="True">
  <ComboBoxItem >Hello 10</ComboBoxItem>
  <ComboBoxItem >Hello 20</ComboBoxItem>
  <ComboBoxItem Visibility="Collapsed">Hello 30</ComboBoxItem>
  <ComboBoxItem >Hello 40</ComboBoxItem>
</ComboBox>
...