トップ回答者
DataContextのValidateチェック

質問
-
ListBoxのItemSouceにDataContextをバインドし、表示しているのですが、
DataContextの中身をValidateでチェックする方法がわかりません。
XAMLでは以下のように書いているのですが。。。
<ListBox>
....
<ListBox.ItemsSource>
<Binding >
<Binding.ValidationRules>
<local:NewValidater />
</Binding.ValidationRules>
</Binding>
</ListBox.ItemsSource>
</ListBox>
回答
-
にわかあめさんの希望はたぶん分かりました。
ここにソースコードをコピーしていただけませんか。どしてブレークポイントがとりませんか。
こちらはかんたんサンプルです。
例1:
<ListBox ItemsSource="{Binding Source={StaticResource listBooks}}"
ItemTemplate="{StaticResource BookTemplate}"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}" >
<ListBox.SelectedItem>
<Binding Path="SelectedBook">
<Binding.ValidationRules>
<local:BookValidationRule/>
</Binding.ValidationRules>
</Binding>
</ListBox.SelectedItem>
</ListBox>
例2:
<ListBox ItemsSource="{Binding Source={StaticResource listBooks}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Loaded="TextBox_OnLoaded" Validation.ErrorTemplate="{StaticResource ValidationTemplate}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
private void TextBox_OnLoaded(object sender, RoutedEventArgs e) {
TextBox textBox = (TextBox)e.Source;
Binding binding = new Binding("Name");
binding.ValidationRules.Add(new BookValidationRule() );
textBox.SetBinding(TextBox.TextProperty, binding);
}
例1と例2のValidationRule
public class BookValidationRule: ValidationRule {
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
...
}
}
以上です。
すべての返信
-
おはよございます。
こちらはValidationRuleです。public class NewValidater:ValidationRule
{
...
public override ValidationResult Validate(
object value, CultureInfo cultureInfo )
{
// TO-DO
}
...
}
よろしく。。 -
ご返答がおくれて申し訳ございません。
したいことは、ListBoxのItemSouceにDataContextの内容をバインディングして表示しようとしています。
(DataContextの内容はDataTableを想定しています。)
そのため、DataContextの内容をItemSouce設定前にチェックしたいと思い、Validateを使用しています。
(型がDataTableと違う、想定した列定義ではない等)
失敗している方法は、
XAML上は以下のとおりです。
<ListBox>
....
<ListBox.ItemsSource>
<Binding >
<Binding.ValidationRules>
<local:NewValidater />
</Binding.ValidationRules>
</Binding>
</ListBox.ItemsSource>
</ListBox>
ValidateはAlexwpfさんの書いてあるのと同じように、書いてあります。public class NewValidater:ValidationRule
{
...
public override ValidationResult Validate(
object value, CultureInfo cultureInfo )
{
// TO-DO
}
...
}ValidationResultをブレークポイントでとめてみようとしても、とまりませんでした。
どうもメソッド自体、とおっていないようです。
(NewValidaterのコンストラクタ自体はブレークポイントでとまりました。)
なにかおかしいところに気づかれた方がいらっしゃったら、よろしくお願いいたします。 -
にわかあめさんの希望はたぶん分かりました。
ここにソースコードをコピーしていただけませんか。どしてブレークポイントがとりませんか。
こちらはかんたんサンプルです。
例1:
<ListBox ItemsSource="{Binding Source={StaticResource listBooks}}"
ItemTemplate="{StaticResource BookTemplate}"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}" >
<ListBox.SelectedItem>
<Binding Path="SelectedBook">
<Binding.ValidationRules>
<local:BookValidationRule/>
</Binding.ValidationRules>
</Binding>
</ListBox.SelectedItem>
</ListBox>
例2:
<ListBox ItemsSource="{Binding Source={StaticResource listBooks}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Loaded="TextBox_OnLoaded" Validation.ErrorTemplate="{StaticResource ValidationTemplate}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
private void TextBox_OnLoaded(object sender, RoutedEventArgs e) {
TextBox textBox = (TextBox)e.Source;
Binding binding = new Binding("Name");
binding.ValidationRules.Add(new BookValidationRule() );
textBox.SetBinding(TextBox.TextProperty, binding);
}
例1と例2のValidationRule
public class BookValidationRule: ValidationRule {
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
...
}
}
以上です。 -