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

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

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

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

WPF

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

Q&A

解決済

2回答

1423閲覧

[C#][WPF]スレッド間通信時のバインドについての疑問

WTB_21

総合スコア12

C#

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

WPF

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

0グッド

0クリップ

投稿2020/07/17 08:13

編集2020/07/17 08:50

独自クラスのセットアクセサを用いてバインドすると反映されない?

DispatcherTimerを使用して定期的にカウントアップする処理を実装しました。
ViewModelでバインド変数にカウント値を設定する際に、独自クラスのセットアクセサを用いた場合、
バインドした値が反映されないようなのですが、どういった理由なのでしょうか?

試したこと

①独自クラス型のプロパティにカウント値を設定、SetアクセサでViewにバインドしている変数に代入
⇒反映されない

②プリミティブ型のViewにバインドしている変数に代入
⇒当たり前ですが反映される

③プリミティブ型のプロパティにカウント値を設定、SetアクセサでViewにバインドしている変数に代入
⇒反映される

①と③の差がわからないです

該当のソースコード

メインウィンドウView

xaml

1<Window x:Class="DispatcherTimerTest.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 mc:Ignorable="d" 7 Title="MainWindow" Height="450" Width="800"> 8 <StackPanel> 9 <Label Content="{Binding LabelContent1}" /> 10 <Label Content="{Binding LabelContent2}" /> 11 <Label Content="{Binding LabelContent3}" /> 12 </StackPanel> 13</Window>

コードビハインド

C#

1using DispatcherTimer; 2using System; 3using System.Windows; 4using System.Windows.Navigation; 5using static DispatcherTimerTest.ViewModel; 6 7namespace DispatcherTimerTest 8{ 9 /// <summary> 10 /// MainWindow.xaml の相互作用ロジック 11 /// </summary> 12 public partial class MainWindow : Window 13 { 14 public MainWindow() 15 { 16 InitializeComponent(); 17 18 DataContext = ViewModel.Instance; 19 } 20 } 21} 22

ViewModel

C#

1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using System.ComponentModel; 5using System.Linq; 6using System.Runtime.CompilerServices; 7using System.Text; 8using System.Threading.Tasks; 9 10namespace DispatcherTimerTest 11{ 12 public class ViewModel : INotifyPropertyChanged 13 { 14 public static ViewModel Instance { get; } = new ViewModel(); 15 public System.Windows.Threading.DispatcherTimer dispatcherTimer; 16 17 private ViewModel() 18 { 19 dispatcherTimer = new System.Windows.Threading.DispatcherTimer(System.Windows.Threading.DispatcherPriority.Normal); 20 dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); 21 dispatcherTimer.Tick += DispatcherTimer_Tick; 22 dispatcherTimer.Start(); 23 } 24 25 private void DispatcherTimer_Tick(object sender, EventArgs e) 26 { 27 // 反映されない!! 28 var source = new ViewSource(); 29 source.LabelContent1++; 30 ViewModel.Instance.Source = source; 31 32 // ラベル2、3は反映される... 33 ViewModel.Instance.LabelContent2++; 34 } 35 36 public class ViewSource 37 { 38 public int LabelContent1; 39 } 40 41 public ViewSource Source 42 { 43 get => _ViewSource; 44 set 45 { 46 _ViewSource = value; 47 LabelContent1 = value.LabelContent1; 48 } 49 } 50 private ViewSource _ViewSource; 51 52 public int LabelContent1 { get => _LabelContent1; set => Set(ref _LabelContent1, value); } 53 private int _LabelContent1; 54 55 public int LabelContent2 56 { 57 get => _LabelContent2; 58 set 59 { 60 Set(ref _LabelContent2, value); 61 LabelContent3 = value; 62 } 63 } 64 private int _LabelContent2; 65 66 public int LabelContent3 { get => _LabelContent3; set => Set(ref _LabelContent3, value); } 67 private int _LabelContent3; 68 69 70 #region INotifyPropertyChanged 71 public event PropertyChangedEventHandler PropertyChanged; 72 protected bool Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 73 { 74 if (Equals(storage, value)) return false; 75 76 storage = value; 77 OnPropertyChanged(propertyName); 78 return true; 79 } 80 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 81 => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 82 #endregion 83 } 84}

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

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

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

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

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

guest

回答2

0

ベストアンサー

そういうことがしたかったのではないと思いますが、

var source = new ViewSource()ですとsource.LabelContent1は0です。
source.LabelContent1++は常に1です。
いつまでたっても増えていきません。

投稿2020/07/17 08:55

TN8001

総合スコア9326

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

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

WTB_21

2020/07/17 09:32

例として書いたコードが手元の実装と異なっており、仰る通りこのコードではインスタンスを生成し直しているためラベルが変わっていないように見えているだけで、 ご指摘の通り質問したい内容に沿っていないため質問を取り下げさせていただきたいと思います。 ご教授ありがとうございました。
guest

0

頑張ってください!Yahoo!知恵袋おすすめです!

投稿2020/07/17 08:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/07/17 08:58

回答になっていないため、低評価させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問