0

私はこのようなことをする必要があります: http ://social.msdn.microsoft.com/Forums/en-US/wpf/thread/982e2fcf-780f-4f1c-9730-cedcd4e24320/

ジョン・スミスがアドバイスしたように、私は最善の方法に従うことにしました。

xamlでバインディングを設定しようとしましたが、機能しませんでした(ターゲットは常にnullでした)。

コードでバインディングを手動で設定することにしたので(デバッグ目的で)、DateRangeオブジェクトの「SetBinding」メソッドを実行する必要があります。

このメソッドは、DateRangeタイプのオブジェクトには存在しません。

何か案は?

<TextBox Grid.Row="1"
         Grid.Column="1"
         Name="Xml_Name"
         >
    <TextBox.Text>
        <Binding XPath="@name" UpdateSourceTrigger="PropertyChanged" >
            <Binding.ValidationRules>
                <local:UniqueValidationRule x:Name="uniqueDatasourcesRule001" >
                    <local:UniqueValidationRule.UniqueCollection>
                        <local:UniqueDependencyObject uu="{Binding  ElementName=Xml_Name, Path=Name, UpdateSourceTrigger=PropertyChanged}" />
                    </local:UniqueValidationRule.UniqueCollection>
                </local:UniqueValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>



public class UniqueDependencyObject : DependencyObject
{
    public static readonly DependencyProperty uu11Property =
        DependencyProperty.Register("uu", typeof(string), typeof(UniqueDependencyObject));

    public string uu
    {
        set { 
            SetValue(uu11Property, value); }
        get { 
            return (string)GetValue(uu11Property); }
    }



}

public class UniqueValidationRule : ValidationRule
{
    public UniqueDependencyObject UniqueCollection
    {
        get;
        set;
    }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        // I set breakpoint to this line and check UniqueCollection.uu - it is always null
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        return new ValidationResult(true, null);
    }
}

//そしてコードでバインド:

                Binding binding = new Binding();
            binding.ElementName = "Xml_Name";
            binding.Path = new System.Windows.PropertyPath("Name");
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;


            UniqueValidationRule uVal = new UniqueValidationRule();
            uVal.UniqueCollection = new UniqueDependencyObject();

            BindingOperations.SetBinding(uVal.UniqueCollection, UniqueDependencyObject.uu11Property, binding);
4

1 に答える 1

7

参照しているフォーラム投稿の詳細をすべて読んだわけではありませんが、データバインディングを使用する前に、データバインディングについていくつか知っておく必要があると思います。

  1. データバインディングのターゲットは依存関係プロパティです

  2. 依存関係プロパティは、 DependencyObjectから派生したクラスで宣言する必要があります(少なくとも、アタッチされたプロパティではない場合は、ここでは説明しません)。

  3. 探しているSetBindingメソッドは、 BindingOperationsの静的メソッド、またはFrameworkElementのメソッドのいずれかです。

したがって、DataRangeクラスの一部のプロパティにバインディングを設定する場合は、DependencyObjectから派生させる必要があり、次のようにバインディングを設定します。

DataRange dataRange = ...
Binding binding = ...
BindingOperations.SetBinding(dataRange, DataRange.StartProperty, binding);

DataRangeがFrameworkElementから派生した場合、次のように記述できます。

dataRange.SetBinding(DataRange.StartProperty, binding);

ここで、DataRange.StartPropertyはDependencyPropertyStartタイプであり、 DataRangeクラスの依存関係プロパティを表します。

少なくとも、MSDNの記事「データバインディングの概要」、「依存関係のプロパティの概要」、および「カスタム依存関係のプロパティ」を読む必要があります。

于 2012-08-20T11:43:53.547 に答える