我想使用过滤器对我的数据进行ComboBox
绑定。为此,我创建了TextBox
和ComboBox
。在后面的代码中,我读取一个文件并生成类Channel的对象,这些对象存储为ComboBox
的项目。虽然编译器不会抛出任何错误,但过滤不能正常工作。如果我写了一些东西,数据就消失了,如果我擦掉了,那就回来了。尝试并尝试后我意识到,如果我开始输入“myNamespace.myChannel”(Unico.Canal),数据仍然存在,但不要过滤。确实是奇怪的行为。我怀疑我把东西放在错误的地方。
(为了更好地理解我已经翻译了代码,Canal =频道)
以下是我的代码方案:
namespace Unico
{
public partial class ControlesArchivo : UserControl, INotifyPropertyChanged
{
public ControlesArchivo()
{
InitializeComponent();
}
public ObservableCollection<Channel> myListChannels //with INotifyPropertyChanged implemented. But I think I don't need it.
private void loadButton_Click(object sender, RoutedEventArgs e)
{
File loadedFile = new File();
loadedFile.read(); //Generates a bunch of data in lists.
foreach (Channel mychan in loadedFile.channels) //Just duplicating the data (maybe this can be avoided)
{
myListChannels.Add(mychan);
}
var view = CollectionViewSource.GetDefaultView(this.miListaDeCanales);
view.Filter = delegate(object o)
{
if (o.ToString().Contains(myTextBox.Text)) //Delicate place
{
return true;
}
return false;
};
myComboBox.ItemsSource = view;
DataContext = this;
}
private void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
((ICollectionView)myComboBox.ItemsSource).Refresh();
myComboBox.SelectedIndex = 0;
}
}
}
数据绑定在XAML中:
ItemsSource="{Binding view}"
编辑:我想我知道问题出在哪里:我没有指定要过滤的属性。我的意思是,你在ComboBox中看到的是myListChannels中列出的channelName
的属性class Channel
。当我设置过滤器时,我不应该知道我在过滤什么?我怎么写这个?非常感谢你。
答案 0 :(得分:1)
是的,你的假设是正确的。
我假设你的翻译,
public ObservableCollection<Channel> myListChannels;
实际上是
public ObservableCollection<Canal> miListaDeCanales;
在命名空间Canal
Unico
<强>更新强>
在您的过滤器中尝试使用ComboBox
中呈现的属性,而不是使用ToString()
(object
)上的o
,如果您没有覆盖ToString()
1}}来自System.Object
。
尝试切换
if (o.ToString().Contains(myTextBox.Text))
到
if (((Canal)o).NameProperty.Contains(myTextBox.Text))
^^应该解决你的问题。
xaml中的DataTemplate
是ComboBox.ItemTemplate
吗?这将解释为什么您会看到ComboBox
中呈现的有效值,否则所有ComboBoxItem
的内容也会呈现为Unico.Canal