Изменить шаблон списка на событие потерянного фокуса в WPF - PullRequest
1 голос
/ 25 февраля 2012

Я хочу представить список с TextBlocks в качестве элементов.Когда пользователь щелкает / выбирает элемент, он превращается в TextBox для редактирования.Как только элементы управления теряют фокус, элемент снова превращается в TextBlock.

Следующий XAML почти работает, так как TextBlock превращается в TextBox при его выборе.Он также возвращается к TextBlock, если я выбираю другой элемент в списке.Проблема заключается в том, что если я перехожу из списка (в данном случае в текстовое поле «Добавить новый»), элемент списка остается в виде текстового поля.

Вопрос ( WPF ListViewItem потерял фокус, событие - Какпопасть на мероприятие? ) выглядело многообещающе, но я не могу заставить его работать.Я попытался использовать свойство IsFocused, но тогда я не смог отредактировать текстовое поле, потому что, когда я попал в текстовое поле, элемент listbox терял бы фокус и, таким образом, возвращался к TextBlock, прежде чем у меня появилась возможность редактировать текст.

Как я могу заставить TextBox вернуться к TextBlock, если список / элемент теряет фокус?

(Любая другая реализация, которая достигает цели, также приветствуется)

<Window x:Class="MyView.MainWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow1" Height="300" Width="200">
    <Window.Resources>
        <DataTemplate x:Key="ItemTemplate">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>

        <DataTemplate x:Key="SelectedTemplate">
            <TextBox Text="{Binding Name, Mode=TwoWay}" />
        </DataTemplate>

        <Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
            <Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <StackPanel >
        <ListBox ItemsSource="{Binding Departments}" HorizontalContentAlignment="Stretch"
                 ItemContainerStyle="{StaticResource ContainerStyle}" />
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBox  Text="{Binding NewDepartmentName, Mode=TwoWay}"  />
            <Button Grid.Column="1" Width="50" Content="Add" Command="{Binding Path=AddNewDepartmentCommand}" />
        </Grid>
    </StackPanel>
</Window>

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

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

<Page.Resources>
    <ResourceDictionary>
        <Style x:Key="ListBoxSelectableTextBox" TargetType="{x:Type TextBox}">
            <Setter Property="IsHitTestVisible" Value="False" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}}" Value="True">
                    <Setter Property="IsHitTestVisible" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</Page.Resources>
<Grid>
    <ListBox ItemsSource="{Binding Departments}" HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Margin="5" Style="{StaticResource ListBoxSelectableTextBox}" Text="{Binding Name}" BorderBrush="{x:Null}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
0 голосов
/ 10 апреля 2014

Есть много способов сделать это:

  1. Над ответом
  2. Создать стиль TextBox на основе TextBoxBase, чтобы при отключении TextBox выглядел как TextBlockустановка BorderThickness = "0", Background = "transparent"
  3. Чтобы оба TextBlock и TextBox находились в каждом ListViewItem, и с помощью описанной выше техники ответа скрывайте и показывайте TextBlock / TextBox согласованно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...