質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

7963閲覧

【C#】【WPF】ReactivePropertyでImageのSourceプロパティをバインドして動的に画像を切り替える方法が知りたい

galmacher

総合スコア37

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/11/01 08:10

画面にImageコントロール、Buttonコントロールを2個(ボタン1,ボタン2と表記)を配置しております。
初期表示時点ではImageコントロールにC:\hoge.jpgを表示して、
ボタン2が押されたらImageの中身をC:\hoge2.jpgに切り替え、
ボタン1が押されたらImageの中身をC:\hoge.jpgに戻すという処理を行いたいです。

そこでReactivePropertyを利用させていただいてボタンのCommandを使って切り替えたく
以下のようにソース(xaml、MainWindow.cs、MainWindowViewModel.cs)を書きました。

xaml

1<Window x:Class="ImageChange.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:ImageChange" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition></RowDefinition> 12 <RowDefinition></RowDefinition> 13 <RowDefinition></RowDefinition> 14 </Grid.RowDefinitions> 15 <Image Source="{Binding rp_main.Value}"></Image> 16 <Button Grid.Row="1" 17 Command="{Binding changecommand}" 18 CommandParameter="1">ボタン1 19 </Button> 20 <Button Grid.Row="2" 21 Command="{Binding changecommand}" 22 CommandParameter="2">ボタン2 23 </Button> 24 25 </Grid> 26</Window> 27

MainWindow

1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 this.DataContext = new MainWindowViewModel(); 7 } 8 }

MainWindowViewModel

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using Reactive.Bindings; 7using System.Windows; 8using System.Windows.Media.Imaging; 9 10namespace ImageChange 11{ 12 class MainWindowViewModel 13 { 14 public ReactiveProperty<BitmapImage> rp_main { set; get; } 15 public ReactiveProperty<BitmapImage> rp_image1 { set; get; } 16 public ReactiveProperty<BitmapImage> rp_image2 { set; get; } 17 public ReactiveCommand<string> changecommand { set; get; } = new ReactiveCommand<string>(); 18 19 public MainWindowViewModel() 20 { 21 BitmapImage image1 = new BitmapImage(new Uri(@"C:\hoge.jpg")); 22 BitmapImage image2 = new BitmapImage(new Uri(@"C:\hoge2.jpg")); 23 rp_image1 = new ReactiveProperty<BitmapImage>(image1); 24 rp_image2 = new ReactiveProperty<BitmapImage>(image2); 25 rp_main = rp_image2; 26 27 changecommand.Subscribe(x => 28 { 29 if (x == "1") 30 { 31 rp_main = rp_image1; 32 MessageBox.Show(rp_main.ToString()); 33 } 34 else 35 { 36 rp_main = rp_image2; 37 MessageBox.Show(rp_main.ToString()); 38 } 39 } 40 ); 41 } 42 } 43}

上記のようにReactiveProperty<BitmapImage>型のrp_mainの中身を、
ボタン押下時のchangecommandによってrp_image1、rp_image2に置き換えています。
しかし、画面上のImageは変化がありません。
MessageBox.Show(rp_main.ToString());によって
rp_mainの中身がボタン押下によって変化していることは
確認できたのですが、画面上に変化が無いのはなぜなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは!
MainWindowViewModel内でrp_mainにrp_image1またはrp_image2を代入していますが、
rp_main**.Valueにrp_image1.Valueまたはrp_image2.Value**を代入するようにすればよいのではないでしょうか?

投稿2018/11/01 08:26

mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

galmacher

2018/11/01 08:50

ご回答ありがとうございます! おっしゃるように.Valueをつけることで画像が切り替わりました。数時間悩んだのがバカみたいです…。 しかし、以下の順に操作すると、一回は画像が切り替わるのですが、「×」のところで切り替わりませんでした。何か原因にお心当たりございますでしょうか。 〇hoge2.jpg初期表示 〇ボタン1をクリックしてhoge.jpgに切り替え ×ボタン2をクリックしてhoge2.jpgにまた戻す
mikupedia

2018/11/01 09:00

elseブロックの中身に誤りはありませんか? 念のためelseブロックのソースコードを提示してもらえますか?
gaya-K

2018/11/01 09:54

横から失礼します。 rp_main = rp_image2; が悪さしてます。 そもそも rp_image1,2 は RP である必要がないので、ただの BitmapImage にしましょう。
mikupedia

2018/11/01 10:01

それが正解っぽいですね rp_main = rp_image2 <ボタン1押下> rp_main.Value = rp_image1.Value → 実際には rp_image2.Value = rp_image1.Value と同じ <ボタン2押下> rp_main.Value = rp_image2.Value → 実際にはrp_image2.Valueは rp_image1のValueの値になっているので画像表示がhoge.jpgのままとなる
galmacher

2018/11/02 14:21

> お二方 ご回答ありがとうございました!!大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問