ボタンが押されて適切なワークスペースが表示されるように、コマンドとワークスペースを実行するようにmvvmデザインパターンを設定しています。ボタンには、コマンドに基づいてテンプレートの適切な画像を取り込むためのテンプレートバインディングがあります。ボタンの配列からボタンが選択されたときのSelectedTemplateResourceのコマンドに別のフィールドを追加しました。DataTemplateがメインウィンドウにプルされ、ボタンが表示されます。
<DataTemplate x:Key="CommandsTemplate">
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Command}">
<Setter Property="Template">
<Setter.Value>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
テンプレートリソースと呼ばれるボタンのテンプレートのように、セッターの値をSelectedTemplateResourceに設定します。これらはすべてmainwindowviewmodelを介して処理され、ボタンごとに適切なテンプレートを設定します。これはうまく機能しますが、選択した状態を終了する方法がわかりません。
また、データトリガーバインディングをコマンドパスに設定する必要があるかどうかも完全にはわかりません。
上記のデザインを使用してボタンの選択された状態を設定する方法を誰かが理解するのを手伝ってもらえますか?
乾杯。
編集 トグルボタントリガーを使用できますが、バインディングが機能していません。何らかの理由でキーを取得し続けるための詳細情報は、app.xaml.csのnullエラーです。
ToggleButtonは、MainWindowResources.xaml(ResourceDictionary)というファイルのデータテンプレートです。MainWindow.xamlファイルは、このデータテンプレートを取得します。リソースファイルの静的リソースを支援するbindableresourceクラスがあります。
public class BindableResource : StaticResourceExtension
{
#region Fields
private static readonly DependencyProperty dummyProperty;
#endregion
#region Properties
/// <summary>
/// Gets and sets my binding.
/// </summary>
public Binding MyBinding { get; set; }
#endregion
#region Constructor
/// <summary>
/// Static contruction of the dummy dependency property.
/// </summary>
static BindableResource()
{
dummyProperty = DependencyProperty.RegisterAttached("Dummy", typeof(string), typeof(DependencyObject), new UIPropertyMetadata(null));
}
/// <summary>
/// Constructor.
/// </summary>
public BindableResource()
{
}
/// <summary>
/// Constructor with binding to set.
/// </summary>
/// <param name="binding"></param>
public BindableResource(Binding binding)
{
MyBinding = binding;
}
#endregion
#region External Members
/// <summary>
/// Get the resource key to bind to the resource.
/// </summary>
/// <param name="serviceProvider"></param>
/// <returns></returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var targetObject = (FrameworkElement)target.TargetObject;
MyBinding.Source = targetObject.DataContext;
var DummyDO = new DependencyObject();
BindingOperations.SetBinding(DummyDO, dummyProperty, MyBinding);
ResourceKey = DummyDO.GetValue(dummyProperty);
return base.ProvideValue(serviceProvider);
}
#endregion
}
ただし、これはトリガーセッター値では機能しません。
<DataTemplate>
<ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Template" Value="{Utilities:BindableResource {Binding Path=SelectedTemplateResource}}" />
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
</DataTemplate>
何か考えやアイデアはありますか?