簡體   English   中英

Windows Phone 7:使ListBox項動態更改

[英]Windows Phone 7: Making ListBox items change dynamically

我正在創建一個Windows Phone應用程序,它將播放從列表中選擇的一系列聲音片段。 我正在使用MVVM(模型視圖 - 模型)設計模式,並為我的數據設計了一個模型,以及我的頁面的視圖模型。 以下是ListBox的XAML:

<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中更改此屬性時,頁面不會更新以反映這一點。

此頁面的ViewModel如下所示:

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));
        }
    }
}

綁定工作正常,我看到數據顯示; 但是,當我更改屬性時,列表不會更新。 我相信這可能是因為當我更改observable集合中的內容時,屬性更改事件不會觸發。

我該怎么做才能解決這個問題? 我已經開始討論這方面的一些信息,但許多教程都沒有涵蓋這種行為。 任何幫助將不勝感激!

謝謝

編輯:根據要求,我添加了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 我這樣做是為了解決問題。 我希望這可能只是一個數據對象。

嘗試將長描述可見性屬性更改為此,以查看是否可以修復它

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

如果它確實對短描述屬性進行了相同的更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM