используя wsf datagridcomboboxcolumn's IsSynchronizedWithCurrentItem - PullRequest
4 голосов
/ 15 января 2011

(см. Ниже мой собственный ответ, который я придумал после того, как разрешил эту фильтрацию для дней и дней). Я пытаюсь достичь следующего сценария в WPF.

У меня есть сетка данных, которая отображает строкиданные для просмотра и дополнительный ввод данных.Это новое приложение, но в нем есть устаревшие данные.

В одно конкретное поле в прошлом случайным образом вводились данные.Теперь мы хотим ограничить значения этого поля определенным списком.Поэтому я использую DataGridComboBoxColumn.FWIW В качестве альтернативы я попробовал это с DataGridTemplateColumn, содержащим ComboBox.

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

Список значений для раскрывающегося списка определен в ресурсе Windows, который называется «месяцы»..

<DataGridComboBoxColumn x:Name="frequencyCombo"   MinWidth="100" Header="Frequency"
   ItemsSource="{Binding Source={StaticResource months}}"
   SelectedValueBinding="{Binding Path=Frequency,UpdateSourceTrigger=PropertyChanged}">
   <DataGridComboBoxColumn.ElementStyle>
     <Style TargetType="ComboBox">
       <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
     </Style>
   </DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>

Происходит следующее: если значение отсутствует в списке, на дисплее ничего не отображается.Во время выполнения я убедился, что элемент IsSynchronizedWithCurrentItem действительно имеет значение False.Просто я не делаю то, что ожидаю.

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

Спасибо большое!

Ответы [ 5 ]

5 голосов
/ 19 января 2011

Я наконец-то решил это. Хитрость заключается в том, чтобы избавиться от comboboxcolumn и использовать шаблон, который имеет текстовое поле для отображения и combobox для редактирования. Тем не менее, я все еще проводил часы с новой проблемой ... делая выбор в выпадающем списке, он изменял любые другие строки, где я также использовал этот выпадающий список в сетке. Угадай, что решило проблему! Свойство IsSynchronizedWithCurrentItem, которое я пытался использовать ранее. :)

 <DataGridTemplateColumn x:Name="frequencyCombo" Header="Frequency">
   <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
       <TextBlock Text="{Binding Path=Frequency}" />
     </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
   <DataGridTemplateColumn.CellEditingTemplate>
   <DataTemplate>
     <ComboBox 
       ItemsSource="{Binding Source={StaticResource frequencyViewSource},
       TargetNullValue=''}"
       SelectedItem="{Binding Path=Frequency}" IsSynchronizedWithCurrentItem="False"
      />
    </DataTemplate>
  </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

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

Я не собираюсь забирать «Ответ» на предложение Марка, поскольку это позволило мне получить приложение в руки моего клиента, но это решение, которое я искал. Я обнаружил, что он похоронен в элементе " connect " после нескольких часов поиска в Интернете.

Спасибо за помощь всем!

0 голосов
/ 16 января 2011

Попробуйте это:

    <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Months}"
                                  Text="{Binding Value}"
                                  IsEditable="True" />

                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
0 голосов
/ 15 января 2011

Вместо того, чтобы смешивать статический ресурс и свойство модели представления в качестве источника для элементов в списке, вы пытались использовать ObservableCollection или CollectionViewSource в модели представления? Затем вы можете вставлять и удалять нестандартные элементы по своему желанию и делать их выбранными (или нет) в любое время. Таким образом, «нормальный» список будет иметь нормальные месяцы, но когда появится нечетный, добавьте его в список и сделайте его выбранным. Похоже, что было бы легче контролировать исключительно в модели представления.

0 голосов
/ 15 января 2011

Почему бы просто не сделать что-то вроде:

//create collection
PagedCollectionView view = new PagedCollectionView(e.Result);
view.SortDescriptions.Add(
new SortDescription("Months", ListSortDirection.Ascending));
gridProducts.ItemsSource = view;

//filter collection by category
PagedCollectionView view = new PagedCollectionView(e.Result);
view.Filter = delegate(object filterObject)
{
    Product product = (Product)filterObject;
    return (product.CategoryName == "Legacy");
};
gridProducts.ItemsSource = view;

//create categories through grouping
PagedCollectionView view = new PagedCollectionView(e.Result);
view.GroupDescriptions.Add(new PropertyGroupDescription("Legacy"));
view.GroupDescriptions.Add(new PropertyGroupDescription("etc..."));
gridProducts.ItemsSource = view;
0 голосов
/ 15 января 2011

Не могли бы вы уточнить, что здесь происходит?Непонятно, что такое «существующее значение» во время выполнения - если это поле, в которое данные вводятся случайным образом, ограничение этого означает, что вы используете некую логику проверки, хотя вы все еще хотите, чтобы она отображалась?

Кроме того, я больше о Silverlight ... разве WPF по умолчанию также использует одностороннюю привязку?

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