选择时按键模板风格(Button Template style when selected)

2019-10-31 15:07发布

我有一个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像这样在所谓TemplateResource按钮的模板。 这些都是通过mainwindowviewmodel处理,以设置每个按钮相应的模板和它的作品很好,但我不知道如何完成所选择的状态。

此外,我完全不知道我是否应该设置datatrigger结合命令路径。

任何人都可以帮助我弄清楚如何设置使用上述设计一个按钮的选中状态?

干杯。

编辑我得到的使用切换按钮触发但是不工作的结合。 下面有一些是由于某种原因,我一直得到密钥的详细信息,在我app.xaml.cs零误差

切换按钮是在一个名为MainWindowResources.xaml( 资源字典 )文件一个DataTemplate。 该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>

任何想法或意见?

Answer 1:

我不知道我知道你想要什么。 你想,如果它的选择是改变按钮的模板?

首先一个标准的按钮没有被“选中”的概念。 你想要一个ToggleButton为。 你可以在它的触发这种方式IsChecked属性来设置你的模板。

<DataTemplate x:Key="CommandsTemplate">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <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 DataContext.SelectedTemplateResource}}">
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                </ToggleButton>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</DataTemplate>


Answer 2:

找出后,这真的是不可能的我带出了C#纯XAML做,创建一个自定义控制......这是很基本的,可以得到改善,我将不得不改变一点,但最终的自定义控件解决了这个问题,这样就可以从资源字典中打click事件和动态更改模板。

public class TabButton : Button
{
    public static readonly DependencyProperty SelectedTemplateProperty = 
        DependencyProperty.Register("SelectedTemplate", typeof(ControlTemplate), typeof(TabButton));

    public ControlTemplate SelectedTemplate
    {
        get { return base.GetValue(SelectedTemplateProperty) as ControlTemplate; }
        set { base.SetValue(SelectedTemplateProperty, value); }
    }

    public TabButton()
    {
        this.Click += new RoutedEventHandler(TabButton_Click);
    }

    ~TabButton()
    {

    }

    public void TabButton_Click(object sender, RoutedEventArgs e)
    {
        ControlTemplate template = (ControlTemplate)this.FindResource("Environmental Template Selected");
        (sender as TabButton).Template = template;
    }
}

干杯。



文章来源: Button Template style when selected
标签: c# wpf mvvm