Фильтр ICollectionView не обновляется - мои привязки неверны? - PullRequest
2 голосов
/ 01 декабря 2011

Начинаем изучать C # / XAML, так что очень хорошо, возможно, не сделали это правильно. Я пишу программу для просмотра изображений, перечисления их по имени файла и текстового поля для поиска, которое автоматически фильтрует список по мере его ввода.

Я неоднократно просматривал свой код C # и вижу, что фильтр действительно работает - и похоже, что обновление тоже срабатывает - однако я не могу визуально заставить его фильтровать или «обновлять» на экране.

C # для поля выглядит следующим образом

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    ICollectionView collectionView = CollectionViewSource.GetDefaultView(AllImages);
    new DynamicFiltering(collectionView, this.TextBoxFilter);
}

public class DynamicFiltering
{
    public DynamicFiltering(ICollectionView filteredView, TextBox textBox)
    {
        string filterText = "";
        filteredView.Filter = delegate(object item)
        {
            MyImages textvalue = item as MyImages;
            string textvaluestring = textvalue.Name as string;
            if (textvaluestring.ToUpper().Contains(filterText.ToUpper()))
                return true;
            else
                return false;
        };
        textBox.TextChanged += delegate
        {
            filterText = textBox.Text;
            filteredView.Refresh();
        };
    }
}

и xaml -

<TextBox x:Name="TextBoxFilter"/>

<ListBox Name="VisualList"
         Template="{StaticResource StandardListBox}"
         DataContext="{Binding AllImages}"
         ItemsSource="{Binding}"
         Width="Auto"
         Grid.Row="1"/>

У меня такое чувство, что проблема в привязке списка, но я не могу выяснить истинную причину. Еще одна вещь, которая, возможно, заслуживает внимания, - это то, что я держу строку и источник изображений внутри каждого объекта в моем списке.

Любая помощь очень ценится!

EDIT: Ниже приведен код, который я использую для заполнения AllImages, используя Environment.SpecialFolder.MyPictures в качестве примера. публичный класс MyImages { public ImageSource _image; открытая строка _name;

        public MyImages(ImageSource image, string name)
        {
            _image = image;
            _name = name;
        }

        public override string ToString()
        {
            return _name;
        }

        public ImageSource Image
        {
            get { return _image; }
        }

        public string Name
        {
            get { return _name; }
        }

    }

    public List<MyImages> AllImages
    {
        get
        {
            List<MyImages> result = new List<MyImages>();
            foreach (string filename in
                System.IO.Directory.GetFiles(
                Environment.GetFolderPath(
                Environment.SpecialFolder.MyPictures)))
            {
                try
                {
                    result.Add(
                    new MyImages(
                    new BitmapImage(
                    new Uri(filename)),
                    System.IO.Path.GetFileNameWithoutExtension(filename)));
                }
                catch { }
            }
            return result;
        }
    }

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Ваши инстинкты на ходу, проблема возникает из ваших привязок.Ваш ItemsSource не привязан к тому же экземпляру представления, который использует ваш фильтр.Попробуйте это так:

    public ICollectionView CollectionView { get; set; }
    public MainWindow()
    {
        InitializeComponent(); 
        DataContext = this;
        CollectionView = CollectionViewSource.GetDefaultView(AllImages);
        new DynamicFiltering(CollectionView, this.TextBoxFilter);
    }

    <ListBox Name="VisualList" 
         DataContext="{Binding CollectionView}" 
         ItemsSource="{Binding}" 
         Width="Auto" 
         Grid.Row="1"/>
1 голос
/ 01 декабря 2011

Вместо вызова Обновить, просто установите фильтр снова.

0 голосов
/ 01 декабря 2011

Ваше чувство было правильным, проблема в привязке списка. Удалите параметр DataContext, а затем установите ItemsSource="{Binding AllImages}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...