【问题标题】:Resource 1 works, 2 doesn't资源 1 有效,2 无效
【发布时间】:2012-04-11 19:41:28
【问题描述】:
<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>

【问题讨论】:

  • 您需要查看dependency property value precendence,因为即使没有错误,这也不起作用。
  • 这有什么问题吗?我围绕命令和工作区设置了一个 mvvm 模式,该命令本质上是一个具有指定主题资源的按钮......它确实有效......它只是在单击按钮时获得所选状态资源的影响以更新。
  • 要修复优先级覆盖,您只需将本地值 (Template="...") 移动到样式中的 Setter
  • 我刚刚编辑了我的问题,我想我对“本地”值感到困惑。
  • 本地值。可以通过“包装器”属性的便利设置本地值,这也等同于在 XAML 中设置为属性或属性元素,或者通过使用特定实例的属性调用 SetValue API。如果您通过使用绑定或资源设置本地值,则它们各自的优先级就像设置了直接值一样。 这不是我在编辑中所做的吗?

标签: wpf


【解决方案1】:

在发现这在纯 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;
    }
}

干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2014-12-25
    • 2010-09-05
    • 2023-03-12
    • 2017-03-19
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多