WPF DataGrid - различные элементы редактирования в одном столбце. - PullRequest
4 голосов
/ 19 июля 2010

Я занимаюсь разработкой приложения WPF 4.0, в котором мне нужно создать сетку, содержащую столбец с текстовым полем или раскрывающимся списком в зависимости от строки. Пример:

| Name      |  Value                   | Help                                   |
| PROP1A    | [textbox]                | Description of prop1a                  |
| Prop2A    | [dropdown v]             | Description of prop2a                  |
| Prop3A    | [textbox] [x checkbox]   | Description of prop2a                  |
| Prop4A    | [dropdown v]             | Description of prop2a                  |
| etc...

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

Моя первоначальная мысль заключалась в том, чтобы реализовать это как коллекцию того, что я назову RowDescriptor s, которая будет указывать имя, тип ввода и справочную информацию (которая является просто текстом), а затем использовать привязку для связывания коллекции в DataGrid. По сути, они будут действовать как ViewModel, и установка значения в DataGrid будет проходить через ViewModel к фактической модели (как в типичном случае для приложения MVVM).

Когда я просматривал имеющуюся у меня документацию, я не смог найти нигде, где обсуждался бы способ динамического изменения типа столбца, как это. Теперь я склоняюсь к использованию Grid и раскладке входов вручную (все еще используя Binding, но привязывая каждый элемент отдельно). С моей стороны это будет гораздо больше ручного труда, поэтому я хотел выяснить, есть ли относительно простой способ реализации моей первой идеи. Похоже, что я должен быть в состоянии что-то сделать с DataGridTemplateColumn, но я относительно новичок в WPF и точно не знаю, как мне поступить.

Ответы [ 2 ]

4 голосов
/ 19 июля 2010

Вы можете сделать это, используя столбец шаблона.

В этом окне будут отображаться одно или два текстовых поля в зависимости от данных в строке.

CellTemplate отображается нормально, но он заменяется CellEditingTemplate при редактировании строки.

<DataGridTemplateColumn Header="Value" Width="350">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock 
            Text="{Binding EffectiveValue,Mode=OneWay,ValidatesOnDataErrors=True}" 
            ToolTip="{Binding EffectiveValue,Mode=OneWay}"
            TextWrapping="Wrap"
            />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>


                <TextBlock  Text="Value" Margin="4"/>
                <TextBox 
                Grid.Column="1"
                Text="{Binding ConfigurationValue,ValidatesOnDataErrors=True}" 
                ToolTip="{Binding ConfigurationValue}"
                TextWrapping="Wrap"
                AcceptsReturn="{Binding DataType, Mode=OneWay, 
                                    Converter={StaticResource ResourceKey=StringMatchBooleanConverter}, ConverterParameter=String}"
                gui:FocusAttacher.Focus="True" 
                />

                <TextBlock  Text="Default Value" Grid.Row="1" Margin="4"
                Visibility="{Binding DefaultConfigurationValue, Converter={StaticResource ResourceKey=NullVisibilityConverter}}"
                        />
                <TextBox 
                Grid.Column="1" 
                Grid.Row="1"
                Text="{Binding DefaultConfigurationValue, Mode=OneWay }" 
                ToolTip="{Binding DefaultConfigurationValue, Mode=OneWay}"
                TextWrapping="Wrap"
                IsReadOnly="True" 
                Visibility="{Binding DefaultConfigurationValue, Converter={StaticResource ResourceKey=NullVisibilityConverter}}"

                />

            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
1 голос
/ 19 июля 2010

Мне приходилось делать это один раз в приложении ASP.NET с GridView, и хотя это другая технология, я думаю, что ответ будет одинаковым. Мне нужно было просто добавить ВСЕ различные виды элементов управления в каждую ячейку, но сначала оставить их невидимыми.

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

Становится веселее, когда вам нужно вернуть значения, но я думаю, что в итоге я нашел видимый элемент управления, а затем принял решение, основываясь на его типе. Я думаю, что это единственный способ добиться этого, поскольку каждый элемент управления сеткой, который я использовал от Microsoft, кажется, предполагает, что вашим столбцам никогда не понадобятся различные типы элементов управления.

Я задавал почти такой же вопрос раньше на SO. Вот сообщение . Может быть, это заставит тебя катиться.

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