2

リストボックスアイテムに適用しているWPFスタイルがあります。現在、各アイテムはKeyValuePairにバインドされています。ListBoxItem内のTextBlockにキーを表示します。

<TextBlock Name="Label" Text="{Binding Key}" />

私がやりたいのは、Styleを汎用にして、データがKeyValuePair(おそらく単なる文字列)でない場合に、データをTextBlockに正しく​​バインドできるようにすることです。

パラメータをStyleまたはDataTemplateに渡す方法、またはデータバインディングを汎用にする方法はありますか?

私のスタイル:

<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListBoxItem">
        <Border x:Name="Border" Padding="2" SnapsToDevicePixels="true" CornerRadius="4" BorderThickness="1">
          <TextBlock Name="Label" Text="{Binding Key}" />
        </Border>
        <ControlTemplate.Triggers>
          <MultiTrigger>
            <MultiTrigger.Conditions>
              <Condition Property="IsSelected" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectionGradient}" />
          </MultiTrigger>
        <ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
4

1 に答える 1

2

簡単な例を挙げましょう。数値が含まれているとしますTextBox。数値が負の場合は背景を赤にし、0 以上の場合は背景を緑にしたいとします。

これがあなたが書くスタイルです:

<TextBlock Text="{Binding Key}" >
  <TextBlock.Style>
    <Style TargetType="TextBox">
      <Setter Property="Background" Value="{Binding Key, Converter={StaticResource MyConverterResource}" />
    </Style>
  </TextBlock.Style>
</TextBlock>

作成するコンバーターは次のとおりです。

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double source = (double)value;
        return source < 0 ? Brushes.Red : Brushes.Green;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // We don't care about this one here
        throw new NotImplementedException();
    }
}

また、xaml でコンバーターにアクセスするには、コンバーターが名前空間にあると仮定して、次の手順を実行するだけですMyNamespace

<Window xmlns:my="clr-namespace:MyNamespace">
  <Window.Resources>
    <my:MyConverter x:Key="MyConverterResource">
  </Window.Resources?
  <!-- Your XAML here -->
</Window>

(もちろん、これを任意Resourcesの に入れることができます 、UserControlまたは何でもかまいません)これにより、次のように記述してコンバーターを呼び出すことができます{StaticResource MyConverterResource}

そして、ここでは、条件付きスタイルがあり、コンバーターは、1 つのパラメーター (私の場合は値自体) に従って背景として設定する色を決定します (ただし、必要なものは何でもかまいません)。

于 2012-09-19T15:55:42.723 に答える