2

この質問をする最善の方法はわかりませんが (あいまいな質問タイトルで申し訳ありません)、基本的には、データ コンテキストからプロパティに渡される値コンバーターを使用して、TextBox に MaxLength プロパティを設定したいと思います。渡されたプロパティのプロパティをコンバータ パラメータとして指定します。コントロールごとではなく、スタイルでこれらすべてを行いたいと思います。これを非スタイルの方法で行う例を次に示します。

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" MaxLength="{Binding MyPropertyName, Converter={StatocRespirceMyCoolConverter}, ConverterParameter=TheirPropertyName}" />

(ご参考までに、TheirPropertyName は [StringMaxLength(15)] のような属性を持つ MyPropertyName の型のプロパティを表し、値コンバーター内で取得して返すことができます。)インスタンスではなく MyPropertyName のタイプを渡す方法はありますか? StringMaxLength 属性のルックアップを行うための型だけが必要です。

とにかく、どうすればこのようなことをスタイルで行うことができますか? 私は次のようになりました:

<Setter Property="MaxLength">
    <Setter.Value>
        <Binding Converter="{StaticResource textFieldMaxLengthConverter}" />
    </Setter.Value>
</Setter>

しかし、それは MyPropertyName オブジェクトとは対照的に、全体的なデータコンテキストを値コンバーターに渡します。バインディングの MyPropertyName.TheirPropertyName 部分を解析して、バインディングの ConverterParameter 属性で theirPropertyName を渡すことができるかどうかは本当にわかりません.

どんなガイダンスも本当に感謝しています!

4

2 に答える 2

5

わかりました、さらに掘り下げた後、私はこれを満足のいくものにしました。RelativeSource Self にバインドしてから、Text プロパティのバインディング式を解析しています (これは TextFieldMaxLength コンバーターであるため、TextBox に対して作業していると想定しています。

リソース ディクショナリでのスタイルアップ:

<Style TargetType="TextBox"> 
  <Setter Property="MaxLength">
    <Setter.Value>
      <Binding Converter="{StaticResource textFieldMaxLengthConverter}" RelativeSource="{RelativeSource Self}" />
    </Setter.Value>
  </Setter>
</Style>

使用法(基本的に、すべてがスタイルにあるため、特別なことは何もする必要がないことを示しています):

<TextBox Text="{Binding MyPropertyName.TheirPropertyName}" />

textFieldMaxLengthConverter の Convert メソッド:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
  Control control = value as Control;
  BindingExpression be = control.GetBindingExpression(TextBox.TextProperty);
  if (be != null)
  {
    string boundPropertyName = be.ParentBinding.Path.Path;
    // .. boundPropertyName here is MyPropertyName.TheirPropertyname, do some parsing and return a value based on that
  }
}

(明らかに、私の実際の実装はもう少し複雑です/予期しない入力を処理します/元の質問のステートメントに従ってリフレクションを使用します)。

とにかく、他の誰かが同様のことをしようとした場合、または私が使用しているよりもこれを行うためのより良い方法がある場合に備えて、このソリューションを投稿すると思いました.

于 2009-11-25T19:48:38.747 に答える
4

マルチ バインディングを使用してルティプル プロパティをコンバーターに渡すことができます。これにより、必要に応じて多くのプロパティに対してバインディングを行うことができます。また、プロパティのいずれかが変更された場合 (INotifyPropertyChanged を実装した場合)、バインディングが再評価されます。あなたがしていることのために、リフレクションを使用して、渡されたオブジェクトのプロパティを、コンバーターのパラメーターと一致する特定のプロパティ名で見つける必要があります。以下のコードを使用することになるとは思いませんが、xaml でバインディングに複数のパラメーターを指定できることを示しています。path、converter、converter パラメータを含みます。ただし、相対的なソースについてはわかりませんが、やりたいことをするために必要になるかもしれません。デバッグの良い方法については、データ バインディングのデバッグをご覧ください。このテクニックは不可欠です。継続して使用しています。

  <Setter
     Property="MaxLength">
     <Setter.Value>
        <Binding
           Converter="{StaticResource textFieldMaxLengthConverter}"
           RelativeSource="{RelativeSource TemplatedParent}"
           Path="MyPropertyName"
           ConverterParameter="TheirPropertyName" />
     </Setter.Value>
  </Setter>
于 2009-11-25T00:37:11.960 に答える