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

时间:2013-12-05 11:58:45

标签: wpf xaml combobox wpf-controls

我的网格中有两列:

名称(文本框) ---- ParentList(组合框)。

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

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

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

我的ParentList包含{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>

3 个答案:

答案 0 :(得分:0)

如果您稍微调整数据类型类,那很容易实现......我不得不猜测ParentList的类型,因为您没有显示它:

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");
}

所以基本的想法是你拥有所有可能值的私人集合......这保持不变。每次更改Name属性时,我们都会根据ParentList方法中的某些过滤条件创建新的IsFiltered

答案 1 :(得分:0)

对我而言,简单而最好的解决方案是编写'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;
            }
        }
    }

答案 2 :(得分:-1)

您可以将ItemsSource作为MultiBinding绑定到列表和文本框,并在转换器中查看列表,并隐藏您不想要的项目(根据文本框)。

不是太好的解决方案,但它应该有效。

这是多重绑定:

<MultiBinding Converter="{StaticResource myConverter}">
  <Binding ElementName="UI" Path="ParentList" />
  <Binding ElementName="txName" Path="Text" />
</MultiBinding>

在转换方法中使用foreach在parnetlist上运行,并且条件是如果ListItem等于文本,则应该折叠它。