Wpf 根据文本框文本更改组合框项目列表
我的网格中有两列: 名称(文本框)---父列表(组合框)。 A--------------------它应该只包含B和C B-------------------A和C C-------------------A和B 我的父列表包含{A,B,C} 如何根据文本框中的文本从列表中隐藏特定项目? 我的代码的XAML是:Wpf 根据文本框文本更改组合框项目列表,wpf,xaml,combobox,wpf-controls,Wpf,Xaml,Combobox,Wpf Controls,我的网格中有两列: 名称(文本框)---父列表(组合框)。 A--------------------它应该只包含B和C B-------------------A和C C-------------------A和B 我的父列表包含{A,B,C} 如何根据文本框中的文本从列表中隐藏特定项目? 我的代码的XAML是: <Grid> <StackPanel > <ListView> <Lis
<Grid>
<StackPanel >
<ListView>
<ListView.View>
<GridView >
<GridViewColumn Header="Name" >
<GridViewColumn.CellTemplate >
<DataTemplate >
<WrapPanel >
<TextBox x:Name="txName" Text="{Binding Name}" />
</WrapPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Parent List" >
<GridViewColumn.CellTemplate >
<DataTemplate >
<WrapPanel >
<ComboBox x:Name="cbParentId" ItemsSource="{Binding Path=ParentList,ElementName=UI}" />
</WrapPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Grid>
您可以将ItemsSource作为多重绑定绑定到列表和文本框,并在转换器中浏览列表,隐藏您不想要的项目(根据文本框) 这不是一个很好的解决方案,但它应该能起作用 这是多重绑定:
<MultiBinding Converter="{StaticResource myConverter}">
<Binding ElementName="UI" Path="ParentList" />
<Binding ElementName="txName" Path="Text" />
</MultiBinding>
在convert方法中,在parnetlist上使用foreach运行,条件是如果ListItem等于文本,则应将其折叠 如果稍微调整一下数据类型类,这很容易实现。。。我不得不猜测您的
家长列表的类型,因为您没有显示它:
private List<string> allItems = GetAllItems();
public ObservableCollection<string> ParentList
{
get { return parentList; }
set
{
parentList = value;
NotifyPropertyChanged("ParentList");
}
}
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("Name");
ParentList = new ObservableCollection<string>(allItems.Where(i => IsFiltered(i)));
}
}
private bool IsFiltered(string item)
{
// implement your filter condition here
return item.StartsWith("A");
}
private List allItems=GetAllItems();
公共可观察集合父列表
{
获取{返回父列表;}
设置
{
父列表=值;
NotifyPropertyChanged(“父列表”);
}
}
公共字符串名
{
获取{返回名称;}
设置
{
名称=值;
NotifyPropertyChanged(“名称”);
ParentList=新的ObservableCollection(allItems.Where(i=>IsFiltered(i));
}
}
私有布尔值已筛选(字符串项)
{
//在这里实现你的过滤条件
退货项目。以“A”开头;
}
所以基本的想法是你拥有所有可能价值的私人收藏。。。这一点保持不变。每次更改Name
属性时,我们都会根据IsFiltered
方法中的某些筛选条件创建一个新的ParentList
。对我来说,最简单、最好的解决方案是编写一个“GotFocus”事件,并将可见性应用到所需的项上
private void combobox_GotFocus_1(object sender, RoutedEventArgs e)
{
var combobox = sender as ComboBox;
if (combobox == null) return;
var model = combobox.DataContext as Model;
foreach (var item in combobox.ItemsSource)
{
if (item.Equals(model.Name))
{
var comboboxItem = combobox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
if (comboboxItem != null)
comboboxItem.Visibility = Visibility.Collapsed;
}
}
}
你能举个例子吗?@zooney用于多重绑定或转换器吗?@1不仅你没有提供任何代码,你的解决方案也很糟糕。@user2760623:两者都是。-或者-使用CollectionView
@HighCore:你能举个CollectionView的例子吗?@zooney,无论何时你想了解WPF,只需转到搜索引擎并键入“WPF objectName类”,然后单击最上面的答案,几乎肯定是MSDN的答案。这就是我刚才做的:。。。这将为您节省大量时间。@Sheridan:除了更改数据结构之外,wpf本身还有其他方法吗?Thx..wpf没有任何“内置”的东西可以做到这一点。。。我的示例不是WPF的“内置”示例。实现这一点还有其他方法,但这是我唯一推荐的方法。例如,您可以附加一个组合框.SelectionChanged
处理程序并从中筛选您的集合,但上述解决方案是迄今为止最简单的。