0
<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>

第一个可绑定资源适用于切换按钮模板属性上的“TemplateResource”,但是“SelectedTemplateResource”在跳跳虎设置器中不起作用。此代码位于资源字典中,而实际资源位于主题资源字典中。

我收到一条错误消息,说 setter 值的 xamlparseexception 的 key 为 null。我一直在这几个小时,但无法弄清楚为什么它不起作用......如果我取出样式并用第二个资源替换第一个绑定它确实显示正确但是样式中的绑定将不起作用.

有人知道为什么吗?

编辑 我刚刚尝试过,但没有运气。

                <ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}">
                    <ToggleButton.Style>
                        <Style TargetType="ToggleButton">
                            <Style.Triggers>
                                <Trigger Property="IsChecked" Value="False">
                                    <Setter Property="Template" Value="{Utilities:BindableResource {Binding Path=TemplateResource}}" />
                                </Trigger>
                                <Trigger Property="IsChecked" Value="True">
                                    <Setter Property="Template" Value="{Utilities:BindableResource {Binding Path=SelectedTemplateResource}}" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                </ToggleButton>
4

1 回答 1

0

在发现在纯 xaml 中确实不可能做到这一点后,我拿出了 c# 并创建了一个自定义控件...这是非常基本的,可以改进,我将对其进行一些更改,但最终自定义控件可以解决这个问题,以便您可以从资源字典中点击点击事件并即时更改模板。

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;
    }
}

干杯。

于 2012-04-12T13:27:26.333 回答