none
DataContextのValidateチェック RRS feed

  • 質問


  • ListBoxのItemSouceにDataContextをバインドし、表示しているのですが、
    DataContextの中身をValidateでチェックする方法がわかりません。

    XAMLでは以下のように書いているのですが。。。

    <ListBox>

    ....
            <ListBox.ItemsSource>
                <Binding >
                    <Binding.ValidationRules>
                        <local:NewValidater   />
                    </Binding.ValidationRules>
                </Binding>
            </ListBox.ItemsSource>
    </ListBox>
    2008年10月28日 13:43

回答

  • 「チェックする」とは ?

    どのような動きを期待してるのでしょうか ?

     

    それを書かないと、なかなか返答は貰えないと思います。

    2008年10月31日 11:39
  • にわかあめさんの希望はたぶん分かりました。
    ここにソースコードをコピーしていただけませんか。どしてブレークポイントがとりませんか。

    こちらはかんたんサンプルです。

    例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)
            {
                ...
            }
        }

    以上です。

    2008年11月4日 10:01

すべての返信

  • おはよございます。

    こちらはValidationRuleです。

    public class NewValidater:ValidationRule
    {
    ...
    public
    override ValidationResult Validate(
    object value, CultureInfo cultureInfo )
    {
    // TO-DO
    }
    ...
    }

    よろしく。。

    2008年10月31日 3:34
  • 「チェックする」とは ?

    どのような動きを期待してるのでしょうか ?

     

    それを書かないと、なかなか返答は貰えないと思います。

    2008年10月31日 11:39
  • ご返答がおくれて申し訳ございません。

    したいことは、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のコンストラクタ自体はブレークポイントでとまりました。)



    なにかおかしいところに気づかれた方がいらっしゃったら、よろしくお願いいたします。
    2008年11月2日 11:25
  • にわかあめさんの希望はたぶん分かりました。
    ここにソースコードをコピーしていただけませんか。どしてブレークポイントがとりませんか。

    こちらはかんたんサンプルです。

    例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)
            {
                ...
            }
        }

    以上です。

    2008年11月4日 10:01
  • こんにちは。中川俊輔です。

     

    Alexwpfさん、FC-Shiro さん、回答ありがとうございます。

     

    にわかあめさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、Alexwpfさん、FC-Shiro さんの回答へ回答済みチェックをつけさせていただきました。

    Alexwpfさんのサンプルのように記述してもうまくいかないようでしたら、詳細なサンプルコード等の

    情報と一緒に質問をしていただけると、情報を得やすいかもしれません。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2008年11月17日 10:12