XAML WinUI中的ListView在重置后保持ListBox文本

gdrx4gfi  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(126)

我在WinUI 3应用程序(目标框架net6.0-windows10.0.19041.0)中有一个ListView,它的数据模板包含一个TextBox。ItemsSource绑定到代码隐藏文件中的ObservableCollection。列表后面还有一个按钮,用于清除集合和添加新项。
我注意到一个奇怪的行为:如果我在TextBox中写入任何内容,则在单击Clear按钮后该文本将保留。我希望它在ListView中插入一个全新的TextBox,其中没有任何文本。
为什么会发生这种情况?它是否与虚拟化有关?
下面是xaml文件:

<Window
    x:Class="WinUISample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:WinUISample"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <ListView ItemsSource="{x:Bind _items }" >
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="x:String">
                    <TextBox Width="250" /> <!-- intentionally empty -->
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button Click="myButton_Click">Clear</Button>
    </StackPanel>
</Window>

下面是代码隐藏文件:

using Microsoft.UI.Xaml;
using System.Collections.ObjectModel;

namespace WinUISample
{
    public sealed partial class MainWindow : Window
    {
        private readonly ObservableCollection<string> _items;

        public MainWindow()
        {
            InitializeComponent();

            _items = new ObservableCollection<string>(new[]
            {
                "1"
            });
        }

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            _items.Clear();
            _items.Add("1");
        }
    }
}
hgc7kmma

hgc7kmma1#

这应该是因为它的Virtualization特性。因为你没有绑定你的Text,你会得到相同的文本。
您可以通过绑定Text来避免这种行为,

<TextBox Width="250" Text="{x:Bind}" />

或者通过改变ItemsPanel来实现。

<ListView ItemsSource="{x:Bind _items}" >
    <!--<ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>-->
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <TextBox Width="250" />
            <!-- intentionally empty -->
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

相关问题