ここに私はそれが私の与えられた状況のために働く使用しています答えがあります。基本的には、VisualStateTriggerを使用し、コードを介して手動でトリガーを作成する必要があります。あなたが使用することができ、多くの組み込みがありますが、私がしなければならなかったこの状況のために、または少なくとも私は手動で1つ書く必要があったと思います。
ここにトリガーコードがあります。
public class StringComparisonTrigger : StateTriggerBase
{
private const string NotEqual = "NotEqual";
private const string Equal = "Equal";
public string DataValue
{
get { return (string)GetValue(DataValueProperty); }
set { SetValue(DataValueProperty, value); }
}
public static readonly DependencyProperty DataValueProperty =
DependencyProperty.Register(nameof(DataValue), typeof(string), typeof(StringComparisonTrigger), new PropertyMetadata(Equal, (s, e) =>
{
var stringComparisonTrigger = s as StringComparisonTrigger;
TriggerStateCheck(stringComparisonTrigger, stringComparisonTrigger.TriggerValue, (string)e.NewValue);
}));
public string TriggerValue
{
get { return (string)GetValue(TriggerValueProperty); }
set { SetValue(TriggerValueProperty, value); }
}
public static readonly DependencyProperty TriggerValueProperty =
DependencyProperty.Register(nameof(TriggerValue), typeof(string), typeof(StringComparisonTrigger), new PropertyMetadata(NotEqual, (s, e) =>
{
var stringComparisonTrigger = s as StringComparisonTrigger;
TriggerStateCheck(stringComparisonTrigger, stringComparisonTrigger.DataValue, (string)e.NewValue);
}));
private static void TriggerStateCheck(StringComparisonTrigger elementTypeTrigger, string dataValue, string triggerValue)
=> elementTypeTrigger.SetActive(dataValue == triggerValue);
}
これ、私は以下掲載しますようStateTriggerBaseから継承するVisualStateTriggersグループで使用することができるからです。私が知りませんでしたのは、あなたが書いた依存関係のプロパティはXAMLで使用でき、それを動作させるためのインターフェイスや何もトリガがないということです。トリガを起動するコードの唯一の行は、状態を変更したいときは常に呼び出さなければならない 'SetActive(ブール値)'です。 XAMLで依存関係のプロパティとバインドを行うと、プロパティが変更されるたびにSetActiveが起動され、ビジュアル状態が変更されます。
DataTemplateは以下のとおりです。
<DataTemplate x:Key="LightsButtonTemplate">
<UserControl>
<StackPanel Name="panel">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<DataTriggers:StringComparisonTrigger DataValue="{Binding Type}"
TriggerValue="READ" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="panel.(UIElement.Background)"
Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock Text="{Binding Type}" />
<TextBlock Text="{Binding LightStateViewModel.On}" />
</StackPanel>
</UserControl>
</DataTemplate>
そして最後に、あなたはどこでものDataTemplateを使用することができます使用するが、私はLightViewModelsのリストにバインドされているItemsControlにでそれを使用しています。
<ScrollViewer Grid.Row="1">
<ItemsControl ItemsSource="{Binding LightViewModels}"
ItemTemplate="{StaticResource LightsButtonTemplate}" />
</ScrollViewer>
明らかにこれは私がライトボタン用にしたいテンプレートデザインではありませんが、これは私が理解して今ダイナミックテンプレートを実装するためのすべてです。うまくいけば、これは他の誰かがWPFから来るのを助けるでしょう。
StateTriggerBaseから派生したカスタムトリガクラスは、必要に応じてバインドしてバインドできます。そのトリガを更新するときはいつでもSetActive(true)またはSetActive(false)を呼び出すだけです。それが真であれば、そのトリガーを使用するVisualStateはアクティブになります。
[DataTemplateSelector](https://msdn.microsoft.com/library/windows/apps/br209469)を使用して、ニーズに応じた適切なitemtemplateを関連付けることを考えましたか? – Romasz
私はXAMLについてはかなり良いと思っていますが、実際にはDataTemplateSelectorは使用していませんので、少し戸惑っています。返信する前に私はそれについて学ぶために少し研究をしました。私はそれを完全に理解していません。私はViewModelの文字列を持っています。私はコントロールにテンプレート(例えばボタン)を適用し、文字列の値が適切なテンプレートを適用するかどうかに応じて適用したいと思います。これができるのであれば、簡単な例で少しでも気になるでしょうか?それがうまくいくなら、私は答えとしてマークして、それに関係なく投票します。 –