WPF - сделать выбранный столбец списка редактируемым при нажатии кнопки

У меня есть listView с презентацией gridview и TextBlocks в каждом столбце. Я хотел бы сделать выбранную строку редактируемой, заменив текстовые блоки текстовыми полями и полями со списком, когда пользователь нажимает кнопку редактирования. Я попытался сделать это, установив стили, которые переключают видимость элементов управления следующим образом:

<Style x:Name="ItemDisplayStyle" TargetType="{x:Type TextBlock}" x:Key="ItemDisplayStyle">
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="Visibility" Value="{Binding Path=dislayMode}" />
    </Style>
    <Style x:Name="ItemEditStyle" TargetType="{x:Type FrameworkElement}" x:Key="ItemEditStyle">
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="Visibility" Value="{Binding Path=editMode}" />
    </Style>

displayMode и editMode — это свойства видимости, заданные в коде программной части. И ниже в xaml:

<GridViewColumn Header="Date de début" Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <TextBlock Margin="-6,0"
                                           HorizontalAlignment="Stretch" TextAlignment="Center"
                                           Text="{Binding Path=DateDebut, Mode=TwoWay}"
                                           Style="{StaticResource ItemDisplayStyle}" />
                                <TextBox   x:Name="tbDateDebut" Margin="-6,0"
                                           HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" 
                                           Text="{Binding Path=DateDebut, Mode=TwoWay}"
                                           Style="{StaticResource ItemEditStyle}" />
                            </Grid>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

Моя проблема в том, что изменение «editMode» и «displayMode» в коде программной части, похоже, не обнаруживается на уровне пользовательского интерфейса.

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


wpf
person Sandy    schedule 29.04.2010    source источник


Ответы (1)


Обновляли ли вы содержимое сетки после внесения изменений? Вы можете использовать метод Grid.GetColumn и отправить объект-отправитель, то есть кнопку редактирования (которая, я полагаю, будет отдельной для каждого столбца), а затем, вероятно, использовать VisualTreeHelper для получения текстового поля и поля со списком в этом столбце.

Кроме того, почему бы вам не использовать свойство «IsReadOnly» TextBox вместо замены TextBlock? Сделайте это истинным или ложным согласно вашему требованию.

person Archie    schedule 29.04.2010
comment
Привет, Обновление содержимого не работает. Я не использую свойство ReadOnly, потому что сначала мне также нужно заменить некоторые TextBlocks ComboBox, поэтому я решил, что будет лучше применить один стиль для всех редактируемых элементов управления, а другой — для всех элементов управления ReadOnly. И, во-вторых, все элементы управления находятся в DataTemplates, поэтому мне все еще нужно установить стили в качестве ресурсов, что возвращает меня к моей первой проблеме, связанной с установкой свойства стиля в установщике из моего кода программной части. - person Sandy; 29.04.2010
comment
Вы меняете режимы обоих? например, настроить видимость одного на видимый, а другого на свернутый? - person Archie; 29.04.2010
comment
Да. Это именно то, что я пытаюсь сделать. Я новичок в .Net в целом, поэтому у меня небольшие трудности с попыткой перевести некоторые коды С# с помощью VisualTreeHelper. - person Sandy; 29.04.2010