こんにちは。
表題のとおり、「IValueConverterクラスで表示する画像の切り替えについて」教えてほしいです。
コンバータークラスで、整数型のデータから画像を表示するプログラムを作成しました。
この整数値は、比較される整数値が更新されたときに表示する画像を変更したいと考えています。
具体的には、以下のようになっています。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var image = null as BitmapImage;
var record = value as SampleRecord;
if (record == null) return null;
if (SelectedNoManager.Instance.SelectedNo == record.No)
{
image = new BitmapImage(new Uri(@"pack://application:,,,/Assets/arrow.png", UriKind.Absolute));
}
else
{
image = new BitmapImage(new Uri(@"pack://application:,,,/Assets/wait.png", UriKind.Absolute));
}
return image;
}
切り替えするnoの値は、ユーザーの操作によっていくつかのウィンドウで再設定される可能性がありました。
そのためSingletonなクラスで保持することにしました。
private static readonly SelectedNoManager _Instance = new SelectedNoManager();
/// <summary>
/// インスタンスを取得します。
/// </summary>
public static SelectedNoManager Instance
{
get { return _Instance; }
}
private int _SelectedNo = 1;
/// <summary>
/// 選択している番号を取得または設定します。
/// </summary>
public int SelectedNo
{
get { return _SelectedNo; }
set
{
_SelectedNo = value;
RaisePropertyChanged(this, "SelectedNo");
}
}
サンプルではウィンドウのボタンを押下して、SelectedNoを1から2に切り替えています。
しかし、ウィンドウの画像が更新されません。こういうときはどのようにして切り替えすることができるのでしょうか。
![]()
サンプルのプログラム
http://1drv.ms/1x2xG3N
以上です。わかるかたいましたら、教えてほしいです。よろしくお願いします。
以下メインウィンドウのコード
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<SampleRecord> _SampleRecords = new ObservableCollection<SampleRecord>
{
new SampleRecord{ No = 1, Name = "太郎A", Args = "おまけ1" },
new SampleRecord{ No = 2, Name = "太郎B", Args = "おまけ2" },
new SampleRecord{ No = 3, Name = "太郎C", Args = "おまけ3" },
new SampleRecord{ No = 4, Name = "太郎D", Args = "おまけ4" },
new SampleRecord{ No = 5, Name = "太郎E", Args = "おまけ5" },
new SampleRecord{ No = 6, Name = "太郎F", Args = "おまけ6" },
new SampleRecord{ No = 7, Name = "太郎G", Args = "おまけ7" },
new SampleRecord{ No = 8, Name = "太郎H", Args = "おまけ8" },
};
/// <summary>
/// サンプルで作成したデータグリッドのデータコレクションを取得または設定します。
/// </summary>
public ObservableCollection<SampleRecord> SampleRecords
{
get { return _SampleRecords; }
set
{
_SampleRecords = value;
RaisePropertyChanged(this, "SampleRecords");
}
}
public MainWindow()
{
InitializeComponent();
// init
this.DataContext = this;
}
/// <summary>
/// <seealso cref="System.ComponentModel.INotifyPropertyChanged.PropertyChanged"/> イベントを発生させます。
/// </summary>
/// <param name="sender">イベントを発生させる元になるオブジェクト。</param>
/// <param name="propertyNames">変化が発生したプロパティ名のテキスト。</param>
public void RaisePropertyChanged(object sender, params string[] propertyNames)
{
if (PropertyChanged == null) return;
foreach (var name in propertyNames)
{
PropertyChanged(sender, new PropertyChangedEventArgs(name));
}
}
/// <summary>
/// ボタンを押下したとき、選択しているNoを変更するためのイベントです。
/// </summary>
/// <param name="sender">未使用。</param>
/// <param name="e">未使用。</param>
private void Button_Click(object sender, RoutedEventArgs e)
{
SelectedNoManager.Instance.SelectedNo = 2;
RaisePropertyChanged(this, "SampleRecords"); // 更新されない
}