繁体   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