Wpf 根据文本框文本更改组合框项目列表

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

我的网格中有两列:

名称(文本框)---父列表(组合框)。

A--------------------它应该只包含B和C

B-------------------A和C

C-------------------A和B

我的父列表包含{A,B,C}

如何根据文本框中的文本从列表中隐藏特定项目?

我的代码的XAML是:

<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
处理程序并从中筛选您的集合,但上述解决方案是迄今为止最简单的。