В WPF DataGrid с DataView позади мы хотим показывать ComboBox в качестве метки, пока не нажмем - PullRequest
1 голос
/ 09 августа 2011

Итак, у нас есть WPF DataGrid с некоторыми ComboBoxами в некоторых ячейках, где есть внешнее отношение, но это означает, что у нас загружаются сотни ComboBox за один раз, что занимает слишком много времени. То, что мы хотели бы сделать, это загрузить метку до тех пор, пока она не будет нажата, и в этот момент загружается ComboBox, мы можем легко сделать это с помощью TextBox.

Проблема в том, что наши комбинированные списки работают и позволяют пользователю изменять значение внешнего ключа в столбце, выбирая из ряда отображаемых значений (например, {Car, Dog, Cat}). Но перед тем, как пользователь щелкнет на ярлыке, на ярлыке отобразится само значение внешнего ключа (например, {1, 2, 3}).

Есть идеи о том, что мы могли бы сделать? Любая помощь наиболее ценится!

<DataGridTemplateColumn Header="Column Name" SortMemberPath="Column Name"> 
    <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate>
            <Label Content="{Binding Path=DataViewBehindColumnName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
           <ComboBox 
            DataContext="{DynamicResource ResourceKey=ViewModel}" 
            ItemsSource="{Binding Path=ReferenceTableName, 
                         Converter={StaticResource dataViewToListConverter}}" 
            DisplayMemberPath="ReferenceTableDisplayNamesColumn" 
            SelectedValuePath="ReferenceTablePrimaryKeyColumn" 
            SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, 
                           Path=Item[DataViewBehindColumnName]}"
            />
        </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

С уважением, Фуга

Ответы [ 2 ]

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

Создайте ViewModel для каждой строки и предоставьте свойство, представляющее разрешенное строковое значение, и другое свойство, представляющее ключ.Свяжите свойство Content меток со свойством string, а поле со списком SelectedValue со свойством key.

Без учета MVVM: создайте упаковщик строковых элементов, содержащий все свойства, необходимые для сетки данных, в том числе одно, котороесодержит разрешенное строковое значение вашего проблемного свойства.

0 голосов
/ 09 августа 2011

Когда я читаю твой пост, я вспоминаю две вещи

1) Виртуализация DataGrid. Это может сэкономить некоторую нагрузку.

2a) Создайте прокси для ваших объектов DataObject с помощью свойства bool "ShowData". По умолчанию это значение false и устанавливается равным true при нажатии на элемент управления. Вы можете сделать это с помощью команды Binding. Если вы не используете ORM, вы можете расширить свой DataSet SourceCode и добавить эту функцию. Впрочем, это может закончиться тяжелой работой.

2b) ComboBox имеет редактируемый шаблон и нередактируемый шаблон (их легко найти в Blend). Свяжите содержимое нередактируемого шаблона, чтобы отобразить статическую строку и редактируемую строку для отношения. Это покажет ваше отношение только тогда, когда вы попытаетесь редактировать selectedItem. Опять же, если вы используете ORM, например NHibernate, вы можете воспользоваться функциями LazyLoading.

...