我在 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");
}
}
}
uj5u.com熱心網友回復:
這應該是因為它的虛擬化功能。由于您沒有系結您的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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506324.html