2010-06-29 90 views
1

我有一個xaml頁面上有30個togglebuttons,我需要將每個togglebutton的4個屬性綁定到我擁有的類。我可以做綁定,但我希望能找到更好的解決方案。綁定到ToggleButton

我班目前看起來是這樣的:

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

正如你可以看到,如果我有4個屬性的每個切換按鈕,這意味着我需要在我班上超過120屬性。有沒有更好的辦法?

回答

0

我對你的場景有點好奇,但這裏是我能想到的最快捷的簡單解決方案。所有的代碼在評論中都有解釋,但如果您有任何疑問,請告訴我。當然,如何做到這一點還有更多的解決方案,但我沒有很多關於你想要做什麼的細節。所以我希望這對你有用。你應該能夠將所有這些粘貼到一個新項目中並讓它工作。

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