|
分類:[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; }
}
|