2012-04-11 8 views
0

Ich habe ein MVVM Design-Muster eingerichtet, um Befehle und Arbeitsbereiche zu tun, so dass eine Taste gedrückt wird und der richtige Arbeitsbereich angezeigt wird. Die Schaltflächen verfügen über eine Vorlagenbindung, um basierend auf dem Befehl das richtige Bild für die Vorlage einzufügen. Ich habe ein anderes Feld zum Befehl für eine SelectedTemplateResource hinzugefügt, wenn die Schaltfläche aus dem Array von Schaltflächen ausgewählt wird. Das DataTemplate wird in das Hauptfenster gezogen, um die Schaltflächen anzuzeigen.Button Vorlage Stil, wenn ausgewählt

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Path=Command}"> 
            <Setter Property="Template"> 
             <Setter.Value> 

             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 

Möchten ich tun möchte, den Wert der Setter auf den SelectedTemplateResource gesetzt ist, wie dies in der Vorlage der Schaltfläche namens TemplateResource. Diese werden alle über das Hauptfenster behandelt, um die entsprechende Vorlage für jede Schaltfläche festzulegen. Es funktioniert gut, aber ich bin nicht sicher, wie ich den ausgewählten Status beenden soll.

Auch bin ich nicht ganz sicher, ob ich die Datentrigger-Bindung auf den Befehlspfad festlegen sollte.

Kann mir jemand helfen, herauszufinden, wie man den ausgewählten Zustand eines Knopfes mit dem oben genannten Design einstellt?

Prost.

BEARBEITEN Ich bekomme die Verwendung des Togglebutton-Auslösers, aber die Bindung funktioniert nicht. Heres einige mehr Informationen als ich aus irgendeinem Grund Schlüssel ist in meinem App.xaml.cs null Fehler immer halten

Die ToggleButton ein Datatemplate in einer Datei MainWindowResources.xaml (Resource) genannt wird. Die Datei MainWindow.xaml ruft diese Datenvorlage ab. Ich habe eine bindabresource-Klasse, um mit der statischen Ressource für die Ressourcendatei zu helfen.

public class BindableResource : StaticResourceExtension 
{ 
    #region Fields 
    private static readonly DependencyProperty dummyProperty; 
    #endregion 


    #region Properties 
    /// <summary> 
    /// Gets and sets my binding. 
    /// </summary> 
    public Binding MyBinding { get; set; } 
    #endregion 


    #region Constructor 
    /// <summary> 
    /// Static contruction of the dummy dependency property. 
    /// </summary> 
    static BindableResource() 
    { 
     dummyProperty = DependencyProperty.RegisterAttached("Dummy", typeof(string), typeof(DependencyObject), new UIPropertyMetadata(null)); 
    } 

    /// <summary> 
    /// Constructor. 
    /// </summary> 
    public BindableResource() 
    { 
    } 

    /// <summary> 
    /// Constructor with binding to set. 
    /// </summary> 
    /// <param name="binding"></param> 
    public BindableResource(Binding binding) 
    { 
     MyBinding = binding; 
    } 
    #endregion 


    #region External Members 
    /// <summary> 
    /// Get the resource key to bind to the resource. 
    /// </summary> 
    /// <param name="serviceProvider"></param> 
    /// <returns></returns> 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     var targetObject = (FrameworkElement)target.TargetObject; 

     MyBinding.Source = targetObject.DataContext; 
     var DummyDO = new DependencyObject(); 
     BindingOperations.SetBinding(DummyDO, dummyProperty, MyBinding); 

     ResourceKey = DummyDO.GetValue(dummyProperty); 

     return base.ProvideValue(serviceProvider); 
    } 
    #endregion 
} 

Dies funktioniert jedoch nicht für den Trigger-Setter-Wert.

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

Irgendwelche Gedanken oder Ideen?

Antwort

0

Nach herauszufinden, das ist wirklich nicht möglich, in reiner XAML zu tun, ich die C# brachte und ein benutzerdefiniertes Steuerelement erstellen ... dies ist sehr einfach und kann auf verbessert werden, und ich werde ein bisschen ändern Es löst jedoch letztendlich ein benutzerdefiniertes Steuerelement, das das Problem löst, sodass Sie das Klickereignis innerhalb des Ressourcenwörterbuchs treffen und die Vorlage im laufenden Betrieb ändern können.

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

Prost.

2

Ich bin mir nicht sicher, ob ich genau verstanden habe, was Sie wollen. Sie möchten die Vorlage der Schaltfläche ändern, wenn sie ja ausgewählt ist?

Erstens hat eine Standardschaltfläche nicht die Vorstellung, "ausgewählt" zu sein. Sie möchten ein ToggleButton dafür. Auf diese Weise können Sie auf seiner IsChecked Eigenschaft auslösen, um Ihre Vorlage festzulegen.

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <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 DataContext.SelectedTemplateResource}}"> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </ToggleButton.Style> 
       </ToggleButton> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 
+0

Das ist genau das, was ich suche, Toggle-Taste macht mehr Sinn, jedoch schaltet die Vorlage nicht, wenn Sie auf die Schaltfläche klicken. – bl4kh4k

+0

Können Sie Ihre Ausgabe auf verbindliche Fehler überprüfen. Ich habe nur den Bindungsweg im Setter geschätzt. – GazTheDestroyer

+0

Sagt, der Schlüssel ist null ... nichts in der Ausgabekonsole ... die Methode sieht richtig aus, wahrscheinlich nur eine dumme Bindung Einschränkung. – bl4kh4k