web-dev-qa-db-ja.com

XAMLで列挙型を使用するにはどうすればよいですか?

WPFを学習しているときに、次の問題が発生しました。

XAMLとは別の名前空間に列挙型があります:

 public enum NodeType
    {
        Type_SYSTEM = 1,              // System
        Type_DB = 2,                  // Database
        Type_ROOT = 512,              // Root folder
        Type_FOLDER = 1024,           // Folder
    }

私のXAMLでは、整数で画像をトリガーしたいです

<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="{NodeType: }">
                <Setter Property="Source" Value="/Images/DB.PNG"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Type}" Value="128">
                <Setter Property="Source" Value="/Images/SERVER.PNG"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

整数値を取得し、XAMLコードで直接列挙型と比較する方法はありますか?

私の列挙型は名前空間AnotherNamespace.Typesにあります

<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB">
                                        <Setter Property="Source" Value="/Images/SERVER.PNG"/> 
33
davymartu

同様の質問がありました ここ 、そして私の最終結果は、enum値として一致させたいConverterParameter値を渡す汎用的な IValueConverter を作成することでした] _、バインドされた値がEnumの(int)値と一致するかどうかに応じて、trueまたはfalseを返します。

最終結果は次のようになります。

XAMLコード:

<DataTrigger Value="True"
             Binding="{Binding SomeIntValue, 
                 Converter={StaticResource IsIntEqualEnumConverter},
                 ConverterParameter={x:Static local:NodeType.Type_DB}}">

コンバータ

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (parameter == null || value == null) return false;

    if (parameter.GetType().IsEnum && value is int)
    {
        return (int)parameter == (int)value;
    } 
    return false;
}
50
Rachel

XAMLヘッダーで名前空間が考慮されていることを確認するだけで、マークアップでカスタムDPと列挙値の両方を直接参照できます。

たとえば、私はこのコードを使用してそれを実行します。

<DataTemplate.Triggers>
  <MultiDataTrigger>
    <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" />
      <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
      <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" />
    </MultiDataTrigger.Setters>
  </MultiDataTrigger>
</DataTemplate.Triggers>

スタイルでDataTriggersにアクセスできないことに注意してください。代わりにDataTemplateまたはControlTemplateを作成する必要があります(ただし、.NET 4はスタイルでトリガーを設定する機能を追加します)。次のように、スタイルからControlTemplateをオーバーライドできます。

<Style x:Key="MyCustomButtonStyle" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <ContentPresenter />
        <ControlTemplate.Triggers>
          <!-- Put your DataTriggers here -->
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

オブジェクトにバインドするDataTemplatesの場合、ContentPresenterを使用して、表示するオブジェクトにコンテンツを設定し、オブジェクトの表示に使用するDataTemplate定義を設定できます。 DataTriggersを使用する方法は常にありますが、それは必ずしも直接ではなく、スタイルを使用するのと同じくらい簡単です。

10
tpartee