0

こんにちは、私は MVVM を初めて使用し、リストボックスをバインドしようとしていますが、機能しません。これが私のコードです

モデル

   public class Musicmodel : INotifyPropertyChanged
   {
    //variables privadas

      private String _artista;
      private Uri _href;
      private String _informacion;
      private Double _Dvalue;

    public String artista
    {
        get
         {
            return this._artista;  
          }
        set
        {
            this._artista= value;

            this.RaisePropertyChanged("artista");
        }
    }

    public Uri href { 
        get {

            return this._href;
         }

        set
        {
            this._href = value;
            this.RaisePropertyChanged("href");
        }

    }
    public String informacion {
        get 
        {
            return this._informacion;
        }

        set
        {
            this._informacion = value;
            this.RaisePropertyChanged("informacion");
        }
    }
    public Double Dvalue
    {
        get
        {
            return this._Dvalue;
        }
        set
        {
            this._Dvalue = value;
            this.RaisePropertyChanged("Dvalue");
        }

    }



    public event PropertyChangedEventHandler PropertyChanged;

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

ビューモデル

public class DownloadFileViewModel : INotifyPropertyChanged
{

    private WebClient clienteDownload;


    private ObservableCollection<Model.Music>_musicSource= new ObservableCollection<Model.Music>();

    public ObservableCollection<Model.Music> musicSource
    {
        get
        {
            return this._musicSource;
        }
        set
        {
            this._musicSource = value;
            RaisePropertyChanged("musicSource");
        }
    }


    private int index = 0;


    //request para descargar la canción
    public void request(Model.Musicmodel item)
    {
        this.clienteDownload = new WebClient();
        this.clienteDownload.DownloadProgressChanged += new DownloadProgressChangedEventHandler(clienteDownload_DownloadProgressChanged);

        //agregamos el item al music
        this.musicSource.Add(item);

        this.clienteDownload.OpenReadAsync(this.musicSource[index].href);

    }


    private void clienteDownload_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
       this.musicSource[index].Dvalue=(double)e.ProgressPercentage;

    }


    public event PropertyChangedEventHandler PropertyChanged;

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


  }
  }

意見

            <ListBox x:Name="list" ItemsSource="{Binding musicSource}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding artista}"/>
                        <ProgressBar Value="{Binding Dvalue}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

コードビハインド

          protected override void OnNavigatedTo(NavigationEventArgs e)
          {

            DownloadFileViewModel download = new DownloadFileViewModel();
            Model.Music newMusic = new Model.Music() { href = new   Uri("http://media1.li.ru/b/4/mp3/2/95366/953662_14Friday_Im_In_Love.mp3", UriKind.Absolute), artista = "the cure" };
            download.request(newMusic);
            this.DataContext = download;
            base.OnNavigatedTo(e);

         }

これをデバッグしましたが、ダウンロードは正常に機能し、ObservableCollection は問題なく正しく入力されますが、リストボックスをバインドしようとすると失敗します。私は何を間違っていますか?ありがとう

4

2 に答える 2

1

問題は非常に単純です。最初に musicSource プロパティを初期化します

private ObservableCollection<Model.Music>_musicSource= new ObservableCollection<Model.Music>();

そして、リクエストが完了したら、それに何かを追加するだけです。はRaiseProperyChanged("Property")、新しい監視可能なコレクションを追加したときにのみ起動しますが、アイテムを追加したときは起動しません。

この行をリクエストの最後に再度追加します (musicSource にデータを入力するとき)。

RaisePropertyChanged("musicSource");

これにより、ビューで別の更新がトリガーされます

編集:

別のアプローチは、次のような追加のフィールドを持つことです

private ObservableCollection<Model.Music>_anotherMusicSource= new ObservableCollection<Model.Music>();

そして、その上ですべてを行い、その後、次のように言います。

musicSource = _anotherMusicSource;

これにより通知がトリガーされ、すべてが機能するはずです

于 2013-10-04T20:03:19.070 に答える
1

プロパティ名にアンダースコアが含まれています

private ObservableCollection<Model.Musicmodel> musicSource= new ObservableCollection<Model.Musicmodel>();

public ObservableCollection<Model.Musicmodel> _musicSource
{
    get
    {
        return this.musicSource;
    }
    set
    {
        this.musicSource = value;
        RaisePropertyChanged("musicSource");
    }
 }

あなたはこれを混同しています-アンダースコアは(伝統的に)パブリックではなくプライベートメンバーにある必要があります-バインディングmusicSourceはプライベートな対象を対象としています

.NET で推奨されている標準規則は次のとおりです。

// Private member variables
private int _someInteger;

// Public ones
public int SomeInteger { get { ... } set { ... } }
于 2013-10-04T19:44:40.673 に答える