ViewModel の状態に応じて、ボタン内に別のコンテンツ テンプレートを設定して、トグル ボタンのように動作させたいと考えています。コードをかなり単純化しましたが、各データ テンプレートでは、ボタンのコンテンツが異なるパス ジオメトリをテキストブロックと共に描画します。
ContentSelector クラス:
public class ContentSelector : DataTemplateSelector {
public DataTemplate TrueTemplate { get; set; }
public DataTemplate FalseTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
if ((bool)item)
return TrueTemplate;
return FalseTemplate;
}
}
編集:ボタンにプロパティを追加してコンテンツを設定しました。ここで、「状態」はビューモデルのブール値であり、コンバーターはビューモデルの状態に基づいて「T」または「F」を返すだけです。
XAML:
<DataTemplate x:Key="HeaderTemplate">
<ContentPresenter>
<ContentPresenter.Content>
<DockPanel LastChildFill="False">
<Button Content="{Binding State, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ButtonContentConverter}}" Command="{Binding ToggleCommand}">>
<Button.ContentTemplateSelector>
<ContentSelector>
<local:ContentSelector.TrueTemplate>
<DataTemplate>
<TextBlock Text="T" ... />
</DataTemplate>
</local:ContentSelector.TrueTemplate>
<local:ContentSelector.FalseTemplate>
<DataTemplate>
<TextBlock Text="F" ... />
</DataTemplate>
</local:ContentSelector.FalseTemplate>
</ContentSelector>
</Button.ContentTemplateSelector>
</Button>
</DockPanel>
</ContentPresenter.Content>
</ContentPresenter>
</DataTemplate>
ContentSelector クラスのブレークポイントに到達できないようです。つまり、ContentSelector クラスで対応する DataTemplate を返すように変更すると、ボタンのコンテンツが 'T' または 'F' に変更されますが、アプリケーションを実行すると、ContentSelector にヒットすることはありません。ボタンは完全に空です。
なぜこれが起こるのかについてのアイデアはありますか?ボタンのコンテンツを ViewModel の State に設定し、それをコンバーターを使用してブール値に変更しようとしましたが、ContentSelector をトリガーするようにボタンのコンテンツを設定する必要があると考えましたが、うまくいきませんでした。