Окно поиска WPF и привязка данных к дереву - PullRequest
0 голосов
/ 02 июня 2009

Я пытаюсь реализовать панель поиска обновлений в режиме реального времени, которая обновляет TreeView при изменении поисковой фразы, однако мне не удается заставить ее обновляться так, как я хочу.

Все элементы присутствуют в древовидной структуре при запуске приложения (на данный момент она содержит только один уровень дочерних элементов). Свойство SearchPhrase также корректно обновляется, когда я набираю текстовое поле и вызывается событие PropertyChanged, однако получение элементов не вызывается. Я предполагаю, что это как-то связано со свойством Items моделей презентации. Я прав?

Вот мой XAML:

<Border BorderBrush="Black">
        <TextBox VerticalAlignment="Top" x:Name="phrase" Text="{ Binding      Path=SearchPhrase, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" Height="24" />
    </Border>
    <TreeView  Height="200" Background="Gainsboro" Name="list" ItemsSource="{ Binding Path=Items, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" ItemTemplate="{StaticResource dataTemplate}" />

А вот и моя презентационная модель:

public class ProjectListPM : BasePM
{
    private List<AnalysisInfo> items;
    private String searchPhrase;

    /// <summary>
    /// Gets or sets the search phrase.
    /// </summary>
    public String SearchPhrase { 
        get
        {
            return this.searchPhrase;
        }
        set
        {
            if (value != null)
            {
                this.searchPhrase = value;
                FirePropertyChanged<ProjectListPM>(o => o.SearchPhrase);
            }
        }
    }

    /// <summary>
    /// The list of analysises to display in the list.
    /// </summary>
    public List<AnalysisInfo> Items { 
        get
        {
            return
                items.OrderByDescending(i => i.GetSearchRelevanceTo(SearchPhrase)).Where(
                    i => i.GetSearchRelevanceTo(SearchPhrase) > 0).ToList();
        }
        set
        {
            if (value != null)
            {
                this.items = value;
                FirePropertyChanged<ProjectListPM>(o => o.Items);
            }
        }
    }

    public ProjectListPM()
    {
        this.items = new List<AnalysisInfo>();
        this.SearchPhrase = String.Empty;
    }
}

public class BasePM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Called when a property is changed.       
    /// </summary>
    /// <typeparam name="T">Type</typeparam>
    /// <param name="exp">Function</param>
    protected void FirePropertyChanged<T>(Expression<Func<T, Object>> exp)
    {
        string propertyName;
        if (exp.Body is UnaryExpression)
            propertyName = ((MemberExpression)((UnaryExpression)exp.Body).Operand).Member.Name;
        else
            propertyName = ((MemberExpression)exp.Body).Member.Name;
        if (PropertyChanged != null)
        {
            //Switch to UI thread
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Ответы [ 2 ]

1 голос
/ 16 июня 2009

Похоже, вы хотите отфильтровать коллекцию элементов в древовидном представлении на основе поисковой фразы.

В качестве немедленного решения вы можете добавить строку в установщик SearchPhrase:

set
{
    if (value != null)
    {
        this.searchPhrase = value;
        FirePropertyChanged<ProjectListPM>(o => o.SearchPhrase);
        FirePropertyChanged<ProjectListPM>(0 => o.Items);
    }
}

Это уведомит пользовательский интерфейс о необходимости обновления элементов в любое время, когда вы установите SearchPhrase.

Если вы хотите использовать другой подход, вы можете расширить BasePM из ItemsControl, установить свойства ItemsSource и Items.Filter в конструкторе и вызвать Items.Refresh () при установке SearchPhrase.

0 голосов
/ 02 июня 2009

Ваш класс List может использоваться WPF? Я бы предложил использовать System.Collections.ObjectModel.ObservableCollection, поскольку он уже реализует события изменения списка, совместимые с WPF.

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