3

インラインで ValueConverter を使用することは可能ですか? ListBox のすべての行の一部を太字にする必要があります。

<TextBlock>
  <TextBlock.Inlines>
     <MultiBinding Converter="{StaticResource InlinesConverter}">
        <Binding RelativeSource="{RelativeSource Self}" Path="FName"/>
     </MultiBinding>
  </TextBlock.Inlines>  
</TextBlock>

それはコンパイルされますが、次のようになります。「MultiBinding」は「InlineCollection」コレクション内では使用できません。「MultiBinding」は、DependencyObject の DependencyProperty でのみ設定できます。

それが不可能な場合、TextBlock 全体を IValueConverter に渡すにはどのような方法をお勧めしますか?

4

3 に答える 3

5

他の誰かが指摘したように、そのエラーが発生する理由Inlinesはありません。Dependency Property過去に同様の状況に遭遇したとき、Attached Properties/Behaviorsが良い解決策であることがわかりました。FNameそれは typeであると仮定しstringます。したがって、添付プロパティもそうです。次に例を示します。

class InlinesBehaviors
{
    public static readonly DependencyProperty BoldInlinesProperty = 
        DependencyProperty.RegisterAttached(
            "BoldInlines", typeof(string), typeof(InlinesBehaviors), 
            new PropertyMetadata(default(string), OnBoldInlinesChanged));

    private static void OnBoldInlinesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var textBlock = d as TextBlock;
        if (textBlock != null) 
        {
            string fName = (string) e.NewValue; // value of FName
            // You can modify Inlines in here
            ..........
        }
    }

    public static void SetBoldInlines(TextBlock element, string value)
    {
        element.SetValue(BoldInlinesProperty, value);
    }

    public static string GetBoldInlines(TextBlock element)
    {
        return (string) element.GetValue(BoldInlinesProperty);
    }
}

次に、これを次のように使用できます (myは、 を含む名前空間を指す xml 名前空間ですAttachedProperty)。

<TextBlock my:InlinesBehaviors.BoldInlines="{Binding FName}" />

上記のバインディングはマルチ バインディングである可能性があり、コンバーターなどを使用することもできます。Attached Behaviorsは非常に強力で、これはそれらを使用するのに適した場所のようです。

また、興味のある方は、に関する記事をご覧くださいAttached Behaviors

于 2013-05-24T15:10:21.573 に答える