0

コーディングするのは簡単なことです。他の質問をチェックしましたが、まだできませんでした。

Web から取得した xml ファイルからいくつかのデータをロードし、それを longlistselector 内に表示するアプリケーションがあります。

私はそれをやった、それはうまくいく、今私はデータの読み込みが完了するまでアクティブなままである不確定なプログレスバーを追加したいと思います。

longlistselector の前にプログレスバーを stackpanel で囲み、その可視性を関数 ProgressBarVisibility にバインドしました (以下のコードを参照)。

        <phone:PivotItem Header="Status">
            <StackPanel>
            <ProgressBar Value ="0" IsIndeterminate="True" Visibility="{Binding ProgressBarVisibility}"/>
            <phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding PivotOne}">
                <phone:LongListSelector.ItemTemplate>
                    <!-- lots of code here -->
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>
            </StackPanel>
        </phone:PivotItem>

MainViewModel.cs では、それが私が書いた方法です。

    using System.Windows;


    public class MainViewModel : INotifyPropertyChanged
    {
    public MainViewModel()
    {
        this.PivotOne = new ObservableCollection<ItemViewModel>();
        this.PivotTwo = new ObservableCollection<ItemViewModel>();
        this.PivotThree = new ObservableCollection<ItemViewModel>();
    }

    /// <summary>
    /// A collection for ItemViewModel objects.
    /// </summary>
    public ObservableCollection<ItemViewModel> PivotOne { get; private set; }
    public ObservableCollection<ItemViewModel> PivotTwo { get; private set; }
    public ObservableCollection<ItemViewModel> PivotThree { get; private set; }

    private string _detailPageTitle = "Default";
    /// <summary>
    /// DetailPageTitle ritorna il titolo della pagina di dettaglio. Viene settato nella funzione che carica la pagina secondaria
    /// </summary>
    /// <returns></returns>
    public string DetailPageTitle
    {
        get
        {
            return _detailPageTitle;
        }
        set
        {
            if (value != _detailPageTitle)
            {
                _detailPageTitle = value;
                NotifyPropertyChanged("DetailPageTitle");
            }
        }
    }

    public bool IsDataLoaded
    {
        get;
        private set;
    }


    private Visibility _progressBarVisibility = Visibility.Collapsed;

    public Visibility ProgressBarVisibility
    {
        get
        {
            return _progressBarVisibility;
        }
        set
        {
            if (value != _progressBarVisibility)
            {
                _progressBarVisibility = value;
                NotifyPropertyChanged("ProgressBarVisibility");
            }
        }
    }


    private Visibility _progressBarVisibility = Visibility.Visible;

    public Visibility ProgressBarVisibility
    {
        get
        {
            return _progressBarVisibility;
        }
        set
        {
            if (value != _progressBarVisibility)
            {
                _progressBarVisibility = value;
                NotifyPropertyChanged("ProgressBarVisibility");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (null != handler)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public void LoadData()
    {
        //progressbar is visible, data not loaded
        this.IsDataLoaded = false;
        ProgressBarVisibility = Visibility.Visible;

        // Load Static and dynamic data -- populate the different pivots
        LoadStaticData();
        LoadXMLFile();

        // data loaded, progressbar collapsed
        this.IsDataLoaded = true;
        ProgressBarVisibility = Visibility.Collapsed;
    }

だから私はsystem.windowsライブラリを含め、可視性クラスを使用しました。とにかく、ロードが完了したときにプログレスバーを消すことができません。

なにか提案を?私はどこでそれを間違っていますか?

前もって感謝します!

解決策: アプリの起動時に loaddata が実行されるため、その時点ではコンテンツはレンダリングされません。

4

2 に答える 2

0

MainViewModelINotifyPropertyChangedは、プロパティの 1 つが変更されたことをビューに通知するために実装する必要があります。さらに、ProgressBarVisibilityプロパティを変更すると、イベントが発生するはずPropertyChangedです。

INotifyPropertyChanged の実装に付属するMVVM フレームワークは多数ありますが、単純なものを自分で簡単に実装できます。

于 2013-08-18T15:21:19.010 に答える
0

ビューに加えられた変更を報告する必要があります。

変化する

public Visibility ProgressBarVisibility { get; set; }

private Visibility _progressBarVisibility;
public Visibility ProgressBarVisibility
{
    get { return _progressBarVisibility;}
    set { _progressBarVisibility = value; RaisePropertyChanged("ProgressBarVisibility");}
}

INotifyPropertyChanged またはそれを実装する基本 ViewModel (MVVMLith : ViewModelBase) を必ず実装してください。

于 2013-08-18T15:19:28.030 に答える