0

私はListBox私のApplicationデザインを持っていItemTemplateSelectorます:

TemplateSelector templateSelector = new TemplateSelector();

templateSelector.SongTemplate = Resources["Template"] as DataTemplate;
templateSelector.SongTemplateCached = Resources["TemplateCached"] as DataTemplate;

HistoryList.ItemTemplateSelector = templateSelector;

そして、それらの違いは、曲がダウンロードされたかどうかです。

これは listbox の ViewModel です:

    ObservableCollection<SongItem> songlist;

    public const int MAX_RECENT = 10000;

    public HistoryViewModel()
    {
        NotificationCenterManager.Instance.AddObserver(UpdateCache, AppConst.UPDATECACH);

        List<SongItem> tmpArr = SqlLiteManager.CreateInstance().LoadHistoryFromDatabase();

        songList = new ObservableCollection<SongItem>(tmpArr);
    }

    public ObservableCollection<SongItem> SongList
    {
        get { return songlist; }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

    private void UpdateCache(Notification p_notification)
    {
        RaisePropertyChanged("SomeName");
    }

曲のダウンロードが完了すると、UpdateCacheメソッドが呼び出されますが、ListBox は更新されません (デザインを SongTemplate モードから SongTemplateCached に変更します)。

どうすれば修正できますか?

編集

XAML:

<ListBox ItemsSource="{Binding Path=VideoList}" Name="HistoryList" Style="{StaticResource myListboxStyle}" BorderThickness="0" 
             Template="{DynamicResource ListViewNewTemplate}" Margin="-2,0,0,0" MouseDoubleClick="Mouse_Double_Click" ScrollViewer.CanContentScroll="False">

        <ListBox.Resources>

            <!--Defines a context menu-->
            <ContextMenu x:Key="MyElementMenu">
                <MenuItem Header="Delete from history" Click="MenuItemDelete_Click"/>
            </ContextMenu>

            <!--Sets a context menu for each ListBoxItem in the current ListBox-->
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/>
            </Style>

        </ListBox.Resources>
    </ListBox>

セレクタ:

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        string filePath = ApplicationDataPaths.GetRootDataPath() + "\\www\\CachedContent\\";

            string file = video.VideoId + "*.mp4";

            string[] listfiles = System.IO.Directory.GetFiles(filePath, file, System.IO.SearchOption.TopDirectoryOnly);
            if (listfiles.Length > 0)
            {
                return VideoTemplateCached;
            }
            else
            {
                return VideoTemplate;
            }
    }
4

1 に答える 1

1

Song-Item のプロパティを変更しますが、Song-Item を含む Collection への Binding があります。CollectionChangedEventアイテムが変更されたときに a を上げない限り、UI を更新するよう通知されません。

UI を更新するには、ObservableCollection や Item PropertyChanged などの通知を実装する必要があると思います。

于 2013-10-23T12:20:58.810 に答える