2011-03-18 57 views
1

我正在創建一個Windows Phone應用程序,該應用程序將播放從列表中選擇的一系列聲音片段。我正在使用MVVM(模型視圖視圖模型)設計模式,併爲我的數據設計了一個模型,以及我的頁面的視圖模型。以下是對ListBox中的XAML看起來像:Windows Phone 7:使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。我做了這件事,看看它是否能解決問題。我希望這可能只是一個數據對象。

+0

根據要求添加顯示MediaModel代碼 – kalvis 2011-03-18 23:24:45

+0

。 – 2011-03-19 00:07:42

回答

4

試着改變你長的描述可見性屬性來這看看能否解決

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

如果它作出的簡短描述屬性相同的變化。

+0

啊!那樣做了!非常感謝你!如果您知道,您是否也可以詳細解釋爲什麼需要進行這種更改以及背景中發生了什麼? – 2011-03-19 00:35:49

+0

列表框需要知道其項目何時更改。通過將NotifyPropertyChanged添加到屬性中,您可以告訴列表框其中一項已更改,並且需要自行更新。 – 2011-03-19 02:24:48