Я разработал образец приложения. Я использовал строку как запись, вы можете сделать это, используя свою собственную сущность. Backspace также работает правильно.
public class FilterViewModel
{
public IEnumerable DataSource { get; set; }
public FilterViewModel()
{
DataSource = new[] { "india", "usa", "uk", "indonesia" };
}
}
public partial class WinFilter : Window
{
public WinFilter()
{
InitializeComponent();
FilterViewModel vm = new FilterViewModel();
this.DataContext = vm;
}
private void Cmb_KeyUp(object sender, KeyEventArgs e)
{
CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(Cmb.ItemsSource);
itemsViewOriginal.Filter = ((o) =>
{
if (String.IsNullOrEmpty(Cmb.Text)) return true;
else
{
if (((string)o).Contains(Cmb.Text)) return true;
else return false;
}
});
itemsViewOriginal.Refresh();
// if datasource is a DataView, then apply RowFilter as below and replace above logic with below one
/*
DataView view = (DataView) Cmb.ItemsSource;
view.RowFilter = ("Name like '*" + Cmb.Text + "*'");
*/
}
}
XAML
Могу ли я спросить, почему вы пытаетесь открыть файл?
Мне нравится следить за развитием Linux (из любопытства, я не разработчик ядра, я делаю Java), и я ранее рассматривал этот вопрос. Я смог найти сообщение LKML об этом, в основном упомянув, что это обычно плохая идея. Я почти уверен, что LWN покрыл его в прошлом году, но мне трудно найти статью.
Если это частный модуль (например, для некоторых пользовательских аппаратных средств, и модуль не будет распределяется), тогда вы можете это сделать, но у меня создается впечатление, что если вы собираетесь отправить свой код на магистраль, это может быть не принято.
Эван Теран упоминает sysfs, который выглядит как хорошая идея для меня.
EDIT:
ОК, я нашел статью, которую я искал, это из Linux Journal . Это объясняет, почему делать такие вещи, как правило, плохая идея, а затем продолжает рассказывать вам, как это сделать в любом случае.
/ proc файловая система также хороша для частного использования, и это легко. http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773.html
, предполагая, что вы можете получить указатели на relavent указатели функций на системные вызовы open
/ read
/ close
, вы можете сделать что-то вроде этого:
mm_segment_t fs = get_fs();
set_fs(KERNEL_DS);
fd = (*syscall_open)(file, flags, mode);
if(fd != -1) {
(*syscall_read)(fd, buf, size);
(*syscall_close)(fd);
}
set_fs(fs);
вам нужно будет создайте «syscall_*
» указатели на функции, которые я показал. Я уверен, что есть лучший способ, но я считаю, что это сработает.
Вообще говоря, если вам нужно читать / записывать файлы из модуля ядра, вы делаете что-то неправильно в архитектуре.
Существуют механизмы (например, netlink или просто зарегистрировать устройство символов), чтобы разрешить модулю ядра разговаривать с вспомогательным процессом в пользовательском пространстве. Этот вспомогательный процесс в пользовательском пространстве может делать все, что захочет.
Вы также можете реализовать системный вызов (или такой), чтобы взять файловый дескриптор, открытый в пользовательском пространстве, и прочитать / записать его из ядра.
Это, вероятно, будет более аккуратным, чем попытка открыть файлы в пространстве ядра.
Есть некоторые другие вещи, которые уже открывают файлы из пространства ядра, вы можете посмотреть на них (на что обращает внимание драйвер цикла?).
Вы также можете найти информацию о sys_call_open в этом руководстве по программированию модулей ядра Linux .