C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WPFで他クラスのメンバをBindした際のエラー赤枠が出ない


(過去ログ 118 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■69514 / inTopicNo.1)  WPFで他クラスのメンバをBindした際のエラー赤枠が出ない
  
□投稿者/ ぼうる (1回)-(2014/01/04(Sat) 15:15:04)

分類:[C#] 

WFPでBINDしたコントロールにValidatesOnDataErrors=trueを設定した場合、Error情報を入力するとコントロールが赤く表示されます。
BINDした変数が他クラスのメンバ(dataClass.strなどピリオドを含むBIND)であった場合赤く表示されません。

下記例は二つのテキストボックスに対して入力チェックを行います。
エラーがあった場合にテキストボックスが赤枠表示されます。

通常のメンバ変数であるmemは正常にエラー情報が取得できています。
DataClassのメンバのNameは値は正常にバインドされているのですが、エラー情報のみ取得されません。
アドバイスよろしくお願い致します。

	<XAML>
	 <!-- 通常のメンバ変数をバインド -->
	 <TextBox  Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding mem,ValidatesOnDataErrors=true}"/>
	 <!-- 他クラスのメンバ変数をバインド -->
     <TextBox  Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding dataClass.Name,ValidatesOnDataErrors=true}"/>
    
	public partial class MainWindow : Window, INotifyPropertyChanged, IDataErrorInfo
	{
		//データクラスのインスタンス(エラーがうまくバインドされない)
		private DataClass _dataClass= new DataClass();
		public DataClass dataClass { get { return _dataClass; } set { _dataClass = value; } }

		//普通のメンバ変数(エラーもうまくバインドされる
		private string _mem;
		public string mem { get { return _mem; } set { _mem = value; } }
		/// <summary>
		/// 入力チェック
		/// </summary>
		public void ValidateCheck()
		{
			if (string.IsNullOrWhiteSpace( dataClass.Name))
			{
				//うまくいかない
				Errors["dataClass.Name"] = "Nameを入力してください";
			}
			else
			{
				Errors["dataClass.Name"] = string.Empty;
			}
			if (string.IsNullOrWhiteSpace( mem))
			{
				//うまくいく
				Errors["mem"] = "memを入力してください";
			}
			else
			{
				Errors["mem"] = string.Empty;
			}
			Notify("dataClass");
			Notify("dataClass.Name");
			Notify("mem");

		}

		/// <summary>入力エラー情報</summary>
		protected Dictionary<string, string> Errors = new Dictionary<string, string>();
		public string Error
		{
			get { throw new NotImplementedException(); }
		}
		public event PropertyChangedEventHandler PropertyChanged;
		/// <summary>
		/// 画面の更新を通知
		/// </summary>
		/// <param name="propertyName"></param>
		public void Notify(string propertyName)
		{
			if (PropertyChanged != null)
				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
		}
		/// <summary>
		/// エラー情報ハッシュ取得
		/// </summary>
		/// <param name="propertyName"></param>
		/// <returns></returns>
		public string this[string propertyName]
		{
			get
			{
				string error = null;
				if (Errors.ContainsKey(propertyName))
				{
					error = Errors[propertyName];
				}
				return error;
			}
		}
		public MainWindow()
		{
			InitializeComponent();
			this.DataContext = this;
		}

		private void button1_Click(object sender, RoutedEventArgs e)
		{
			ValidateCheck();
		}

	}

	/// <summary>
	/// データクラス
	/// </summary>
	public class DataClass
	{
		public string Name { get; set; }
	}
	




引用返信 編集キー/
■69515 / inTopicNo.2)  Re[1]: WPFで他クラスのメンバをBindした際のエラー赤枠が出ない
□投稿者/ Hongliang (151回)-(2014/01/04(Sat) 16:47:59)
仕様です。
この場合、DataClassの方にもIDataErrorInfoを実装させて、DataClass.Nameのエラー情報はDataClass内で設定させる必要があります。
引用返信 編集キー/
■69516 / inTopicNo.3)  Re[2]: WPFで他クラスのメンバをBindした際のエラー赤枠が出ない
□投稿者/ ????? (2回)-(2014/01/04(Sat) 19:33:20)
No69515 (Hongliang さん) に返信
> 仕様です。
> この場合、DataClassの方にもIDataErrorInfoを実装させて、DataClass.Nameのエラー情報はDataClass内で設定させる必要があります。


ご指摘の通り、DataClassに実装を移すことで解決しました。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -