Сложный телерик: RadCombobox ItemsSource Binding - PullRequest
1 голос
/ 30 августа 2011

Я сталкиваюсь с трудной обязательной ситуацией.Я использую Telerik RadGridView с GridViewComboBoxColumn.У меня есть два поля со списком «От» и «Кому», которые должны разделять List<int>.Когда пользователь закрывает поле со списком От, представленные значения должны отражать «доступный» диапазон целых чисел.Доступные целые числа состоят из диапазона целых чисел в текущих строках From и To минус диапазоны в других строках.

Проблема, с которой я сталкиваюсь, состоит в том, что поле со списком From является границей List<int> икогда я создаю список доступных целых чисел, он удаляет диапазон целых чисел, найденных во всех других невыбранных строках.Например, если у меня есть List<int> 1-48, а первый ряд имеет диапазон 25-36, а второй ряд имеет диапазон 37-42.Когда пользователь опускает поле со списком От, открытое в первой строке, ему представляется список 1-36 и 43-48.Диапазон 37-42 недоступен, поскольку он используется во втором ряду.

Строка 1 От = 25 до = 36 Строка 2 От = 37 до = 42

ЭТО ПРОБЛЕМА:Поскольку связанный список не содержит целых чисел 37-42, то происходит то, что выбранный элемент для второй строки больше не доступен в списке и не будет отображаться в сетке.Строка со списком «От» строки 2 должна отображать «37» после закрытия поля со списком «От строки 1».Мне нужен способ запоминания значений невыбранных строк и отображения этих значений в поле со списком «От», даже если они не найдены в связанном списке.

К вашему сведению: я не беспокоюсь по поводу поля со списком TOздесь, вероятно, любое решение для FROM также может быть применено к списку TO.

Я знаю, что это сбивает с толку, пожалуйста, спросите, если у вас есть вопросы.В основном мне нужен способ сохранить невыбранные строки выбранных элементов, когда эти элементы больше не присутствуют в связанном списке.Мне нужно только отобразить оригинальное выбранное значение.Элементы в поле со списком для второго ряда не имеют значения, пока не откроется раскрывающийся список.Затем ситуация изменится на противоположную, и мне нужно будет вспомнить выбранный элемент для первой строки.

    telerik:GridViewComboBoxColumn x:Name="cboFrom2" Header="From" Width="Auto"
IsFilterable="False" IsGroupable="False" IsReorderable="False" IsSortable="False"
DataMemberBinding="{Binding StrandFrom}" EditTriggers="CellClick" >
      <telerik:GridViewComboBoxColumn.EditorStyle>
        <Style TargetType="telerik:RadComboBox">
          <Setter Property="OpenDropDownOnFocus" Value="True"/>
        </Style>
      </telerik:GridViewComboBoxColumn.EditorStyle>
    </telerik:GridViewComboBoxColumn>

1 Ответ

1 голос
/ 30 августа 2011

Если я вас правильно понимаю, как насчет использования мультиконвертера, который объединяет список доступных опций с выбранной опцией?

В вашем ViewModel сохраните ObservableCollection доступных опций.Это любой номер, который не используется вашими данными.Всякий раз, когда изменяется свойство To или From элемента данных, изменяйте список доступных параметров.

Затем привязывайте свои комбинированные списки к этому списку доступных параметров и используйте мультиконвертер, чтобы добавить текущий выбранный элемент вItemsSource

Вот примерный псевдокод.Я не запускал его через компилятор или что-то еще, но он должен дать вам общее представление.

Просмотреть модель

public ObservableCollection<int> AvailableNumbers;
public ObservableCollection<MyClass> DataObjects;

foreach(var obj in DataObjects)
{
    obj.PropertyChanged += DataObject_PropertyChanged;
}

void DataObject_PropertyChanged(src as object, e as PropertyChangedEventArgs)
{
    if (e.PropertyName == "To" || e.PropertyName == "From")
        // Adjust AvailableNumbers list
}

XAML

<ComboBox SelectedItem="{Binding From}">
    <ComboBox.ItemsSource>
        <MultiBinding Converter="{StaticResource CombineListAndObjectMultiConverter}">
            <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}" 
                     Path="DataContext.AvailableNumbers"/>
            <Binding Path="From" />
        </MultiBinding>
    </ComboBox.ItemsSource>
</ComboBox>

А ваш CombineListAndObjectMultiConverter просто добавит объект в список и вернет список.

...