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"/>
同様の質問がありました ここ 、そして私の最終結果は、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;
}
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を使用する方法は常にありますが、それは必ずしも直接ではなく、スタイルを使用するのと同じくらい簡単です。