5

私はwpfとxamlを初めて使用します。ここで検索するか、グーグルで検索することで、ほとんどの問題の解決策を(他の言語で)見つけますが、これは私を夢中にさせました。グーグルでたくさん検索して、たくさんのフォーラムを閲覧しましたが、今回は本当に挑戦したようです!

Window.Resourcesに次のコードがあります。

<my:NameConverter x:Key="NameConverter"/>

<MultiBinding x:Key="CustomerFullNameBinding" 
              Converter="{StaticResource NameConverter}"
              ConverterParameter="LastNameFirst">
     <Binding Path="FirstName"  />
     <Binding Path="MiddleName" />
     <Binding Path="LastName" />
</MultiBinding>

NameConverterクラスは、名前の個々の部分を組み合わせてフルネームを返します戻り値は、 ConverterParameterの値に基づいており、FirstNameFirst、LastNameFirst、OnlyFirstName、OnlyLastName、Initialsのいずれかになります(さらにいくつかありますが、簡単にするために、それらは考慮しません)。

このコードは正常に機能します。結果を得るために以下を使用します:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>

ただし、問題は、コードでリソースCustomerFullNameBindingを20回使用すると(上記のように)、すべてのリソースが1つの特定の形式で名前を表示することです。(つまり、CustomerFullNameBindingの宣言で、ConverterParameter = "LastNameFirst"を設定したので、20個の参照すべてにその方法でのみ名前が表示されます。)

今私の質問は、ConverterParameterの値を動的に設定できるように、それをより「一般化」することができるかということです。つまり、フルネームをさまざまな形式で表示できる複数のテキストブロックを持つことができます。次のように複数のリソースを作成すれば可能だと思います。

 <MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
               Converter="..." ConverterParameter="FirstNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst" 
               Converter="..." ConverterParameter="LastNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName" 
               Converter="..." ConverterParameter="OnlyFirstName">
      ......
 </MultiBinding>

 ... and so on ...

しかし、私はそれを望んでいません。'cozそれは本当に私のコードをかさばりすぎてしまい、そして最も重要なことに、それはリソースの再利用性の概念を無効にするでしょう!

考えられる解決策を教えてください。
前もって感謝します。

注:私はここから元のアイデアを得ました。同様の作業例は、msdn.microsoft.com / en-us / library/ms771336.aspxにあります。

タグ:wpf xaml staticresource dynamicresourcebinding

4

1 に答える 1

3

各インスタンスで使用される表示モードを変更できるようにするには、次のようにしたと思います。

  • 名前の 3 つの部分を表示するために、UserControl3 つの s を持つ を作成します。TextBlock
  • バインディングの対象となる名前の部分について、上記にプロパティを追加します。
  • 表示するモードのプロパティを追加します ( FirstNameFirstLastNameFirstなど)。

上記では、名前の各部分のバインディングが必要になるため、それを簡素化する 1 つの方法は、 、、およびプロパティを持つ構造体として宣言されUserControlた型の に単一のプロパティを作成することです。その後、そのプロパティに単一を使用できます。違いは、3 つの部分を取り、フォーマットされた文字列ではなく新しい構造体を返すことです。NameDataFirstMiddleLastMultiBindingNameConverterNameData

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />

<!-- and so on... -->

アイデアは、フォーマットをデータから分離することです。

物事をつまずかせたのは、1 つMultiBindingをリソースとして宣言することでした。通常、for each ケースを変更できるように、バインドしているMultiBindingon eachがあります。TextBlockConverterParameter

編集:を変更できるようにしたかったことは知っていますがConverterParameter、 の 1 つのインスタンスが、 または のターゲットである必要がある ではなくプレーンなプロパティであるため、実際MultiBindingには不可能ConverterParameterです。DependencyPropertyDynamicResourceBinding

于 2009-08-13T14:59:53.947 に答える