2012-04-11 48 views
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> 

第一个可绑定资源对togglebutton的模板属性上的“TemplateResource”起作用,但“SelectedTemplateResource”在tiggers设置器中不起作用。此代码位于资源词典中,实际资源位于主题资源词典中。Resource 1 works,2 does not

我得到一个错误,指出对于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> 
+0

你会想看看[依赖属性值precentdence](http://msdn.microsoft.com/en-us/library/ms743230.aspx),因为即使没有错误,这也不起作用。 – 2012-04-11 19:43:59

+0

反正有这个吗?我有一个围绕命令和工作区设置的mvvm模式,命令基本上是一个具有指定主题资源的按钮......它可以工作......它只是获取点击按钮时选定状态资源更新的影响。 – bl4kh4k 2012-04-11 19:45:36

+1

要修正优先覆盖,只需将样式中的本地值('Template =“...”')移动到'Setter'。 – 2012-04-11 19:48:03

回答

0

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

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

干杯。