簡體   English   中英

WinUI中的ListView在重置后維護ListBox文本

[英]ListView in WinUI maintains ListBox text after reset

我在 WinUI 3 應用程序(目標框架 net6.0-windows10.0.19041.0)中有一個 ListView,其數據模板包含一個 TextBox。 ItemsSource 綁定到代碼隱藏文件中的 ObservableCollection。 列表后還有一個按鈕,用於清除集合並添加新項目。

我注意到一個奇怪的行為:如果我在 TextBox 中寫了任何內容,那么在我單擊“清除”按鈕后,該文本將被保留。 我希望它在 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");
        }
    }
}

這應該是因為它的虛擬化功能。 由於您沒有綁定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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM