Как изменить свойство listboxitem (здесь текстовое поле) при нажатии события listboxitem (здесь кнопка)

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

Вот что я пробовал:

   <ListBox  Name="ListUrl" ItemsSource="{Binding .,Source=CollectionUrl,BindsDirectlyToSource=True}">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="IsSelected" Value="True"/>
                        <Setter Property="Background" Value="Gray"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100" />
                        <ColumnDefinition Width="30" />
                        <ColumnDefinition Width="30"/>
                    </Grid.ColumnDefinitions>
                    <RadioButton>
                        <TextBox Name="TextBoxUrl" Text="{Binding Path=urlString, Mode=TwoWay}" Foreground="Gray",IsReadOnly= True>
                            <TextBox.Style>
                                <Style TargetType="TextBox">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding ElementName=EditButton , Path=IsPressed}" Value="True">
                                            <Setter Property="IsReadOnly" Value="False"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </RadioButton>

                    <Button Name="EditButton" Content="Edit" Grid.Column="1" Click="Button_Click">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Setter Property="ClickMode" Value="Press"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>
                    <Button Content="Delete" Grid.Column="2" Click="Button_Click_1" HorizontalAlignment="Right" Margin="0">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True">
                                        <Setter Property="Visibility" Value="Visible" />
                                        <Setter Property="ClickMode" Value="Press"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>              
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>  

person NewInDevelopment    schedule 06.06.2014    source источник


Ответы (1)


Вместо Button используйте ToggleButton и создайте одно свойство bool IsEditing в своем классе, содержащее свойство urlString.

Затем вы можете привязать IsEditing как к ToggleButton.IsChecked, так и к TextBox.IsReadOnly, например

<ToggleButton IsChecked="{Binding IsEditing}"/>

<TextBox Name="TextBoxUrl" IsReadOnly="{Binding IsEditing}"/>

Не нужно говорить, что ваш класс должен реализовать INotifyPropertyChanged и изменение свойств Raise для IsEditing.

person Nitin    schedule 06.06.2014