WPF ListView настройка SelectedItem - PullRequest
       18

WPF ListView настройка SelectedItem

2 голосов
/ 18 февраля 2010

Я пытался найти ответ на этот вопрос, но мне не повезло.По сути, у меня есть представление списка, которое связано с коллекцией, возвращенной из модели представления.Я связываю выбранный элемент представления списка со свойством в моем списке просмотра, чтобы выполнить проверку, чтобы убедиться, что элемент выбран.Проблема в том, что иногда я хочу загрузить этот список с одним из уже выбранных элементов.Я надеялся, что смогу установить свойство в моей модели представления с выбранным объектом и автоматически выбрать этот элемент.Это не происходитМой список просмотра загружается без выбранного элемента.Я могу успешно установить выбранный индекс на 0-й индекс, так почему я не могу установить выбранное значение.Представление списка находится в режиме одиночного выбора.

Вот соответствующий код из моего представления списка

<ListView Name="listView1" ItemsSource="{Binding Path=AvailableStyles}" SelectionMode="Single">
            <ListView.SelectedItem>
                <Binding Path="SelectedStyle" ValidatesOnDataErrors="True" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" BindingGroupName="StyleBinding" >

                </Binding>
            </ListView.SelectedItem>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="StyleImage">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                               <Image Source="800.jpg"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Style Code" DisplayMemberBinding="{Binding StyleCode}"/>
                    <GridViewColumn Header="Style Name" DisplayMemberBinding="{Binding StyleName}"/>
                </GridView>
            </ListView.View>
        </ListView>

А вот соответствующий код из моей модели просмотра

public class StyleChooserController : BaseController, IDataErrorInfo, INotifyPropertyChanged
{
    private IList<Style> availableStyles;
    private Style selectedStyle;

    public IList<Style> AvailableStyles 
    {
        get { return availableStyles; }
        set
        {
            if (value == availableStyles)
                return;

            availableStyles = value;

            OnPropertyChanged("AvailableStyles");
        }
    }
    public Style SelectedStyle 
    {
        get { return selectedStyle; }
        set
        {
            //if (value == selectedStyle)
            //    return;

            selectedStyle = value;

            OnPropertyChanged("SelectedStyle");
        }
    }

    public StyleChooserController()
    {
        AvailableStyles = StyleService.GetStyleByVenue(1);

        if (ApplicationContext.CurrentStyle != null)
        {
            SelectedStyle = ApplicationContext.CurrentStyle;
        }
    }

    public string Error
    {
        get { return null; }
    }

    public string this[string columnName]
    {
        get
        {
            string error = string.Empty;
            if (columnName == "SelectedStyle")
            {
                if (SelectedStyle == null)
                {
                    error = "required";
                }
            }

            return error;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

}

Я должен отметить, что "Стиль"ссылка здесь не имеет ничего общего с WPF.Это бизнес-объект.Я действительно ищу решение, которое не нарушает паттерн MVVM, но я бы хотел, чтобы что-то заработало.Я попытался перебрать список Listview.Items, просто чтобы установить его вручную, но он всегда пуст при попытке.Любая помощь приветствуется.

Редактировать: я обновил код для использования INotifyPropertyChanged.Это все еще не работает.Любые другие предложения 2-е редактирование: я добавил UpdateSourceTrigger = "PropertyChanged".Это все еще не сработало.

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

Ваша проблема, скорее всего, вызвана тем, что ваш SelectedItem Style - это экземпляр Style, отличный от соответствующего в AvailableStyles в ItemsSource.

Что вам нужно сделать, это предоставить конкретное определение равенства в вашем Style классе:

public class Style: IEquatable<Style>
{
    public string StyleCode { get; set; }
    public string StyleName { get; set; }
    public virtual bool Equals(Style other)
    {
        return this.StyleCode == other.StyleCode;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Style);
    }
}
0 голосов
/ 18 февраля 2010

Хм ... похоже, вы забыли реализовать INotifyPropertyChanged для свойства SelectedStyle ...

...