Windows Phone 7: динамическое изменение элементов ListBox - PullRequest
1 голос
/ 19 марта 2011

Я работаю над созданием приложения для Windows Phone, которое будет воспроизводить серию аудиоклипов, выбранных из списка.Я использую шаблон проектирования MVVM (модель представления модели) и разработал модель для моих данных вместе с моделью представления для моей страницы.Вот как выглядит XAML для ListBox:

<ListBox x:Name="MediaListBox" Margin="0,0,-12,0" ItemsSource="{Binding Media}" SelectionChanged="MediaListBox_SelectionChanged" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">

                <ListBox.ItemTemplate >
                    <DataTemplate>
                        <StackPanel Margin="0,0,0,17" Width="432" Orientation="Horizontal">
                            <Image Source="../Media/Images/play.png" />
                            <StackPanel >
                                <TextBlock Text="{Binding Title}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding ShortDescription}" TextWrapping="Wrap" Margin="12,-6,12,0" Visibility="{Binding ShortDescriptionVisibility}" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                <TextBlock Text="{Binding LongDescription}" TextWrapping="Wrap" Visibility="{Binding LongDescriptionVisibility}" />
                                <StackPanel>
                                    <Slider HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Visibility="{Binding LongDescriptionVisibility}" ValueChanged="Slider_ValueChanged" LargeChange="0.25" SmallChange="0.05" />
                                </StackPanel>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Мой вопрос такой: я хочу иметь возможность развернуть и свернуть часть элементов в ListBox.Как видите, у меня есть привязка для видимости.Эта привязка исходит от MediaModel.Однако, когда я изменяю это свойство в ObservableCollection, страница не обновляется, чтобы отразить это.

Модель представления для этой страницы выглядит следующим образом:

public class ListenPageViewModel : INotifyPropertyChanged
{
    public ListenPageViewModel()
    {
        this.Media = new ObservableCollection<MediaModel>;

    }

    /// <summary>
    /// A collection for MediaModel objects.
    /// </summary>
    public ObservableCollection<MediaModel> Media { get; private set; }

    public bool IsDataLoaded { get; private set; }

    /// <summary>
    /// Creates and adds the media to their respective collections.
    /// </summary>
    public void LoadData()
    {
        this.Media.Clear();
        this.Media.Add(new MediaModel()
        {
            Title = "Media 1",
            ShortDescription = "Short here.",
            LongDescription = "Long here.",
            MediaSource = "/Media/test.mp3",
            LongDescriptionVisibility = Visibility.Collapsed,
            ShortDescriptionVisibility = Visibility.Visible
        });

        this.Media.Add(new MediaModel()
        {
            Title = "Media 2",
            ShortDescription = "Short here.",
            LongDescription = "Long here.",
            MediaSource = "/Media/test2.mp3",
            LongDescriptionVisibility = Visibility.Collapsed,
            ShortDescriptionVisibility = Visibility.Visible
        });

        this.IsDataLoaded = true;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

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

Что я могу сделать, чтобы исправить это?Я искал какую-то информацию по этому поводу, но многие учебники не охватывают такого рода поведение.Любая помощь будет принята с благодарностью!

Спасибо

Редактировать: По запросу я добавил код MediaModel:

    public class MediaModel : INotifyPropertyChanged
{
    public string Title { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    public string MediaSource { get; set; }
    public Visibility LongDescriptionVisibility { get; set; }
    public Visibility ShortDescriptionVisibility { get; set; }

    public MediaModel()
    {
    }

    public MediaModel(string Title, string ShortDescription, string LongDescription, string MediaSource, Visibility LongDescriptionVisibility, Visibility ShortDescriptionVisibility)
    {
        this.Title = Title;
        this.ShortDescription = ShortDescription;
        this.LongDescription = LongDescription;
        this.MediaSource = MediaSource;
        this.LongDescriptionVisibility = LongDescriptionVisibility;
        this.ShortDescriptionVisibility = ShortDescriptionVisibility;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Изначально у меня не было реализации этого классаINotifyPropertyChanged.Я сделал это, чтобы увидеть, решит ли это проблему.Я надеялся, что это может быть просто объект данных.

1 Ответ

4 голосов
/ 19 марта 2011

Попробуйте изменить свойство видимости длинного описания на это, чтобы увидеть, исправит ли оно его

private Visibility _longDescriptionVisibility;
public Visibility LongDescriptionVisibility
{
    get { return _longDescriptionVisibility; }
    set
    {
        _longDescriptionVisibility = value;
        NotifyPropertyChanged("LongDescriptionVisibility");
    }
}       

Если оно действительно внесет те же изменения в свойство краткого описания.

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