2012-04-11 3 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> 

トグルボタンのテンプレートプロパティの最初のバインド可能なリソースは "TemplateResource"で動作しますが、 "SelectedTemplateResource"は、Tiggersセッターでは機能しません。このコードは、実際のリソースがテーマ化されたresourcedictionary内にあるresourcedictionary内にあります。リソース1は動作しません2は

setter値がxamlparseexceptionの場合、keyがnullであるというエラーが表示されます。私はこれを何時間もかけて階段を上ってきましたが、なぜそれがうまくいかないのか分かりません...スタイルを取り出して第1のバインディングを第2のリソースに置き換えると、適切に表示されますが、スタイル内のバインディングは機能しません。

誰もが何故考えているのですか?

編集 私はこれを試しましたが、運はありませんでした。これを見つけた後

   <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

[dependency property value precendence](http://msdn.microsoft.com/en-us/library/ms743230.aspx)を参照すると、エラーがなくても機能しないためです。 –

+0

とにかくこの周辺にはありますか?コマンドとワークスペースの周りにmvvmパターンが設定されていて、コマンドは基本的に指定されたテーマリソースを持つボタンです...ボタンをクリックすると、選択された状態リソースの影響を受けるだけです。 – bl4kh4k

+1

優先順位オーバーライドを修正するには、ローカル値( 'Template =" ... "')をスタイル内の 'Setter'に移動するだけです。 –

答えて

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

乾杯。

関連する問題