2017-10-15 27 views
1

重複する質問が出る前に、私は自分の問題の解決策を見つけられないように思えます。私がしたいのは、配列の要素をプロパティにバインドするだけで、私の経験が不足しているためにどのようになっているのか分かりません。ここでArrayの要素をxamlプロパティにバインドする

は、私のC#のコードがどのように見えるかです:

 <Image Grid.Column="1" Name="WeatherIconZero" Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 

を私のコードが行き、エラーなしで実行されます。ここでは

public class MainPageImplement : INotifyPropertyChanged 
{ 
    BitmapImage[] weatherIconSource = new BitmapImage[7]; 
    public BitmapImage[] WeatherIconSource 
    { 
     get { return weatherIconSource; } 
     set 
     { 
      weatherIconSource = value; 
      NotifyPropertyChanged("WeatherIconSource"); 
     } 
    } 
    private void NotifyPropertyChanged(string propName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

は私のXAMLプロパティがどのように見えるかです実際には何も結び付けていません。しかし、配列からの要素ではなく、BitmapImage変数を使用するとうまくいきます。

+0

あなたはどのように設定している:あなたがIndexOutOfRangeException取得しないように、このようなあなたのコレクションをインスタンス化し、その後

Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}" Source="{x:Bind PropertyName.WeatherIconSource[2], Mode=OneWay}" Source="{x:Bind PropertyName.WeatherIconSource[5], Mode=OneWay}" 

を'WeatherIconSource'プロパティ?個々のインデックスを個別に変更すると(つまり、WeatherIconSource [0] = myBitmap;)、UIへのプロパティの変更は通知されないためです。 'ObservableCollection 'を使うだけで、あなたはたくさんの苦痛を救うことができます。配列はUIに変更を通知しません。 – Laith

+0

私は正しいプロパティを取得するためのメソッドの "シリーズ"を持っていると言うことができますか?これらのメソッドの中には、他のプロパティで共有されるものもあります。 UIを更新するために、これらの配列を更新するメソッドを呼び出すためのタイマーを設定しました。配列を更新するたびに、PropertyChangedを呼び出してUIを更新する 'set'があります。これは、配列を使用せず、各プロパティに一意のパスを与えるとき、完璧に機能します。しかし、配列を使用すると、コードの見栄えが向上し、何百行ものコードが保存されます。編集:私は、別のスレッドで実行される特定の時刻にUIを更新していることを追加する必要があります。 – Oybek

+0

Ok、私の答えは以下の通りです。 – Laith

答えて

1

配列は、少なくともではないインデックスごとに、UIにバインド可能ではありません。 ObservableCollection<T>を使用する必要があります。

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage>(); 

配列を使用しないでください。あなたが単一のインデックスを更新するたびに、あなたは配列で立ち往生している場合は、あなたが財産を通知する必要が

NotifyPropertyChanged("WeatherIconSource[5]"); // Doesn't work. 

シングルindexプロパティの変更を通知することはできませんが、コレクション全体に変更:

WeatherIconSource[5] = myNewBitmap; 
NotifyPropertyChange("WeathIconSource"); // Updates all [0] [1] ... [n] 

しかし、これを行うと、すべてのインデックスを強制的にリフレッシュします。すべての画像が再描画されます。あなたのアプリが小さな画像でシンプルであれば、これで逃げることができます。それ以外の場合は、ObservableCollection<T>に変更します。

あなたは、このような正確な指標とバインディング、ハードコードされている場合:

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage> 
{ 
    null, // [0] 
    null, // [1] 
    null, 
    null, 
    null, 
    null, 
    null // [6] 
}; 
+0

これはとても美しい解決策です。それは完全に動作します。どうもありがとうございました! – Oybek

0

それがあるべき、

`<Image Grid.Column="1" Name="WeatherIconZero" Source="{Binding weatherIconSource[0]}" HorizontalAlignment="Center" VerticalAlignment="Center" /`> 
+0

私はそれを試したが、同じ結果があったと付け加えるべきです。上記の – Oybek

+0

は私の解決策ではうまく動作します – Sajeetharan

+0

私はもう一度試してみました。 NotifyPropertyChangedメソッドに問題がありますか? – Oybek

関連する問題