我的网格中有两列:
名称(文本框) ---- 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>
答案 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等于文本,则应该折叠它。