如何比较文本框的文本 属性 与 UWP 中的 ListView 项

How to compare Text property of Text Box with ListView items in UWP

我正在编写一个 UWP 应用程序。我在其中有一个 MainPageMainPage 里面有 splitviewsplitview.content 里面有一个 frame。我通过这个 frame 导航到各个页面。在一页中,我有一个 Grid。在 Grid 中我有三个 rows。中间一行有ListView。问题就出现在这里。 ListView 工作正常。但是突然由于未知原因,项目之间的边距变得很长。前两个 items 可以。它们在屏幕上可见。但是第三个和以后的所有 items 都在下面,而且差距非常大。即使更改 ListViewListViewItems 的边距也不会改变任何东西。 ListViewObservable collection 绑定。 XAML代码是:

<ListView Grid.Row="1" x:Name="AccountsList"   ItemsSource="{x:Bind accounts}" >
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="data:Account">
                        <TextBlock Text="{x:Bind Name}" Margin="0,0,0,0" >
                        </TextBlock>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

问题的原因在code behind的某处。用户在 textbox 中写入文本并单击 Add Button。我正在尝试从 ObservableCollection 的每个 ListViewitem 或数据绑定 属性 访问 text 并将其与用户提供的 Text 进行比较以添加到 ObservableCollection.如果 textsame,则该过程中止,否则该项目将添加到 ObservableCollection。 C#代码是

if (AccountsList.Items.Any())
        {
            string[] newName =AccountsList.Items.Select(x=>x.ToString()).ToArray();
            int itemCount = newName.Count();
            CountTextBlock.Text = itemCount.ToString();
            for (int j = 0; j <= itemCount; j++)
                foreach(var item in newName )
                if (NameTextBox.Text.ToString() == item)
                {
                    await new Windows.UI.Popups.MessageDialog("Name already added- Write a new name in the Text box to Add").ShowAsync();
                }
                else
                {

                    accounts.Add(new Account { Name = NameTextBox.Text });
                    NameTextBox.Text = "";
                }
        }
        else
        {

            accounts.Add(new Account { Name = NameTextBox.Text });
            NameTextBox.Text = "";
        }

使用 CountTextBlock 进行测试 purpose.The CountTextBlock.Text 在添加 second item 时显示 1 **。 **3 ** 添加 third item 时,**15 ** 添加 fourth item 时。**255 添加 fifth item 时。 底部边距 随着每个新 addition 的增加而增加。当我尝试添加 sixth item 时, "OutOfMemoryException" 被抛出。我只是想比较 listView itemsCollectionListView DataBounded,用户在 文本框 中输入,以避免 重复

你可以试试这个组合。

ListViewItemPresenter

<Style x:Key="ListViewItemPresenterStyle" TargetType="ListViewItemPresenter">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="ContentMargin" Value="0"/>
        <Setter Property="Margin" Value="0"/>
    </Style>

ListViewItem

<Style x:Key="ListViewItemStyle" TargetType="ListViewItem">
        <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
        <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="TabNavigation" Value="Local"/>
        <Setter Property="IsHoldingEnabled" Value="True"/>
        <Setter Property="Margin" Value="0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <ListViewItemPresenter CheckHintBrush="{ThemeResource ListViewItemCheckHintThemeBrush}"
                                           CheckBrush="{ThemeResource ListViewItemCheckThemeBrush}"
                                           ContentTransitions="{TemplateBinding ContentTransitions}"
                                           CheckSelectingBrush="{ThemeResource ListViewItemCheckSelectingThemeBrush}"
                                           DragForeground="{ThemeResource ListViewItemDragForegroundThemeBrush}"
                                           DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}"
                                           DragBackground="{ThemeResource ListViewItemDragBackgroundThemeBrush}"
                                           DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
                                           FocusBorderBrush="{ThemeResource ListViewItemFocusBorderThemeBrush}"
                                           Padding="{TemplateBinding Padding}" PointerOverBackgroundMargin="1"
                                           PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}"
                                           PointerOverBackground="Transparent"
                                           ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                           SelectedPointerOverBorderBrush="Transparent"
                                           SelectionCheckMarkVisualEnabled="True"
                                           SelectedForeground="Transparent"
                                           SelectedPointerOverBackground="Transparent"
                                           SelectedBorderThickness="0"
                                           SelectedBackground="Transparent"
                                           Style="{StaticResource ListViewItemPresenterStyle}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ListView 控件

<ListView ItemContainerStyle="{StaticResource ListViewItemStyle}"></ListView>

如您所见,您可以在 Presenter 和 item 这两种样式中设置边距。尝试告诉我这是否解决了问题。

我能够从其他资源中找到答案。正确的代码块是:

 if (AccountsList.Items.Any())
                {
                    int count = AccountsList.Items.Count();
                    int check = 0;
                    for (int i = 0; i <= count - 1; i++)
                    {
                        if (NameTextBox.Text == (AccountsList.Items[i] as Account).Name)
                        {
                            await new Windows.UI.Popups.MessageDialog("Name already added- Write a new name in the Text box to Add").ShowAsync();
                            break;
                        }
                        check += 1;
                        if (check == count)
                            accounts.Add(new Account { Name = NameTextBox.Text });
                    }

                }
                else
                {

                    accounts.Add(new Account { Name = NameTextBox.Text });

                }
                NameTextBox.Text = string.Empty;

我在比较 TextBox.TextListView.Items 时遇到问题。下面的代码解决了这个问题

if (NameTextBox.Text == (AccountsList.Items[i] as Account).Name)

现在我可以比较两个值并仅在新值唯一时输入新值以避免重复。