2010-06-29 3 views
1

J'ai une page xaml avec 30 boutons bascule et j'ai besoin de lier 4 propriétés de chaque bouton toggle à une classe que j'ai. Je suis capable de faire la liaison, mais j'espère trouver une meilleure solution.Liaison à ToggleButton

Ma classe ressemble actuellement quelque chose comme ceci:

public int ToggleButton1Height; 
public int ToggleButton1Width; 
.. 
public int ToggleButton2Height; 
public int ToggleButton2Width; 
..etc 

Comme vous pouvez le voir si j'avais 4 propriétés pour chaque togglebutton, cela signifie que je besoin de plus de 120 propriétés dans ma classe. Y a-t-il un meilleur moyen?

Répondre

0

Je suis un peu curieux au sujet de votre scénario, mais voici la solution simple la plus rapide que je puisse penser. Tout le code est expliqué dans les commentaires, mais faites le moi savoir si vous avez des questions. Bien sûr, il y a une tonne de solution sur la façon de le faire, mais je n'ai pas beaucoup de détails sur ce que vous essayez de faire. J'espère que cela fonctionne pour vous. Vous devriez pouvoir copier tout cela dans un nouveau projet et le faire fonctionner.

XAML:

<Window x:Class="StackOverflowTests.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" 
    x:Name="window1" 
    Width="800" 
    Height="600" 
    Loaded="Window1_Loaded"> 
    <Window.Resources> 
     <!-- 
      Create a style so you don't have to define the properties 30 times. 
      The style will tell the ToggleButtons which properties in your class they should look at. 
      The ToggleButtonClass object will be bound on the code side 
     --> 
     <Style TargetType="{x:Type ToggleButton}" x:Key="toggleButtonStyle"> 
      <Setter Property="Height" Value="{Binding ToggleButtonHeight}" /> 
      <Setter Property="Width" Value="{Binding ToggleButtonWidth}" /> 
      <Setter Property="Content" Value="{Binding ToggleButtonText}" /> 
     </Style> 
    </Window.Resources> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <StackPanel x:Name="theStackPanel"> 
      <!-- 
       You still have to set the style in each button, in case you add buttons that you don't want to use the properties 
       If you don't want to manually set the style, remove the x:Key="toggleButtonStyle" property from the style above 
       and also remove the Style="{StaticResource toggleButtonStyle}" from all the toggle buttons below. 
      -->   
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
      <ToggleButton Style="{StaticResource toggleButtonStyle}" /> 
     </StackPanel> 
    </ScrollViewer> 
</Window> 

C#:

using System.Windows; 
using System.Windows.Controls.Primitives; 

namespace StackOverflowTests 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     // Creating all the classes and setting the DataContext of each ToggleButton 
     private void Window1_Loaded(object sender, RoutedEventArgs e) 
     { 
      int sizeFactor = 0; 

      // for each ToggleButton in the StackPanel, create one instance of the ToggleButtonClass 
      // and assign it to the DataContext of the ToggleButton, so all the binding in the Style 
      // created in XAML can kick in. 
      foreach (UIElement element in theStackPanel.Children) 
      { 
       if (element is ToggleButton) 
       { 
        sizeFactor++; 

        ToggleButtonClass toggleButtonClass = new ToggleButtonClass() 
        { 
         ToggleButtonHeight = sizeFactor * 20, 
         ToggleButtonWidth = sizeFactor * 50, 
         ToggleButtonText = "Button " + sizeFactor 
        }; 

        (element as ToggleButton).DataContext = toggleButtonClass; 
       } 
      } 
     } 
    } 

    // your toggle button class 
    public class ToggleButtonClass 
    { 
     public double ToggleButtonHeight { get; set; } 
     public double ToggleButtonWidth { get; set; } 
     public string ToggleButtonText { get; set; } 
    } 
}