如何比较文本框的文本 属性 与 UWP 中的 ListView 项
How to compare Text property of Text Box with ListView items in UWP
我正在编写一个 UWP 应用程序。我在其中有一个 MainPage。 MainPage 里面有 splitview
和 splitview.content
里面有一个 frame。我通过这个 frame 导航到各个页面。在一页中,我有一个 Grid。在 Grid 中我有三个 rows
。中间一行有ListView
。问题就出现在这里。 ListView
工作正常。但是突然由于未知原因,项目之间的边距变得很长。前两个 items
可以。它们在屏幕上可见。但是第三个和以后的所有 items
都在下面,而且差距非常大。即使更改 ListView
和 ListViewItems
的边距也不会改变任何东西。 ListView
与 Observable 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
.如果 text
是 same
,则该过程中止,否则该项目将添加到 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 items 或 Collection 与 ListView 是 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.Text
和 ListView.Items
时遇到问题。下面的代码解决了这个问题
if (NameTextBox.Text == (AccountsList.Items[i] as Account).Name)
现在我可以比较两个值并仅在新值唯一时输入新值以避免重复。
我正在编写一个 UWP 应用程序。我在其中有一个 MainPage。 MainPage 里面有 splitview
和 splitview.content
里面有一个 frame。我通过这个 frame 导航到各个页面。在一页中,我有一个 Grid。在 Grid 中我有三个 rows
。中间一行有ListView
。问题就出现在这里。 ListView
工作正常。但是突然由于未知原因,项目之间的边距变得很长。前两个 items
可以。它们在屏幕上可见。但是第三个和以后的所有 items
都在下面,而且差距非常大。即使更改 ListView
和 ListViewItems
的边距也不会改变任何东西。 ListView
与 Observable 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
.如果 text
是 same
,则该过程中止,否则该项目将添加到 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 items 或 Collection 与 ListView 是 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.Text
和 ListView.Items
时遇到问题。下面的代码解决了这个问题
if (NameTextBox.Text == (AccountsList.Items[i] as Account).Name)
现在我可以比较两个值并仅在新值唯一时输入新值以避免重复。