资源1工作,2不工作

时间:2012-04-11 19:41:28

标签: wpf

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

第一个可绑定资源适用于togglebutton的模板属性中的“TemplateResource”,但“SelectedTemplateResource”在tiggers setter中不起作用。此代码位于resourcedictionary中,其中实际资源位于主题resourcedictionary中。

我收到错误,说明对于setter值,xamlparseexception的键为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>

1 个答案:

答案 0 :(得分:0)

在发现这真的不可能在纯xaml中做了我带出了c#并创建了一个自定义控件...这是非常基本的,可以改进,我会改变一点但最终是自定义控件解决了这个问题,以便您可以从资源字典中点击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;
    }
}

干杯。