2009-05-15 10 views
59

Während es einfach ist, den Checked-Status einer Checkbox in einer Variablen mithilfe des Click-Ereignisses der Checkbox zu speichern, wie würde ich dies über Datenbindung machen? Alle Beispiele, die ich gefunden habe, haben die Benutzeroberfläche von einer Datenquelle aktualisiert oder binden ein Steuerelement an ein anderes; Ich möchte eine Mitgliedsvariable aktualisieren, wenn das Kontrollkästchen angeklickt wird.WPF-Kontrollkästchen Bindung

TIA für alle Hinweise ...

Antwort

40

Sie brauchen eine Abhängigkeitseigenschaft für dieses:

public BindingList<User> Users 
    { 
     get { return (BindingList<User>)GetValue(UsersProperty); } 
     set { SetValue(UsersProperty, value); } 
    } 

public static readonly DependencyProperty UsersProperty = 
    DependencyProperty.Register("Users", typeof(BindingList<User>), 
     typeof(OptionsDialog)); 

Sobald dies geschehen ist, binden Sie das Kontrollkästchen, um die Abhängigkeitseigenschaft:

<CheckBox x:Name="myCheckBox" IsChecked="{Binding ElementName=window1, 
    Path=CheckBoxIsChecked}" /> 

Dafür arbeiten Sie Ihre Fenster oder Benutzersteuerelement in seinem Start-Tag nennen müssen, und verwenden Sie diesen Namen in dem Elemente Parameter.

Mit diesem Code ändern Sie die Textbox, wenn Sie die Eigenschaft auf der Codepage ändern. Wenn Sie das Textfeld aktivieren/deaktivieren, ändert sich auch die Abhängigkeitseigenschaft.

EDIT:

Eine einfache Möglichkeit, eine Abhängigkeitseigenschaft ist die Eingabe das Snippet propdp zu erstellen, die Ihnen mit dem allgemeinen Code für Abhängigkeitseigenschaften geben.

der gesamte Code:

XAML:

<Window x:Class="StackOverflowTests.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" x:Name="window1" Height="300" Width="300"> 
    <Grid> 
    <StackPanel Orientation="Vertical"> 
     <CheckBox Margin="10" x:Name="myCheckBox" 
       IsChecked="{Binding ElementName=window1, Path=IsCheckBoxChecked}" 
       >Bound CheckBox</CheckBox> 
     <Label Content="{Binding ElementName=window1, Path=IsCheckBoxChecked}" 
       ContentStringFormat="Is checkbox checked? {0}"></Label> 
     </StackPanel>  
    </Grid> 
</Window> 

C#:

using System.Windows; 

namespace StackOverflowTests 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public bool IsCheckBoxChecked 
     { 
      get { return (bool)GetValue(IsCheckBoxCheckedProperty); } 
      set { SetValue(IsCheckBoxCheckedProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for 
     //IsCheckBoxChecked. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty IsCheckBoxCheckedProperty = 
      DependencyProperty.Register("IsCheckBoxChecked", typeof(bool), 
      typeof(Window1), new UIPropertyMetadata(false)); 

     public Window1() 
     {    
      InitializeComponent(); 
     } 
    } 
} 

Beachten Sie, wie der einzige Code hinter der Abhängigkeitseigenschaft ist. Sowohl das Label als auch die Checkbox sind daran gebunden. Wenn sich das Kontrollkästchen ändert, ändert sich auch die Beschriftung.

+0

Danke für die Antwort. Es erscheint "ElementName" als fehlende Schlüsselzutat. – Number8

+0

Froh ich könnte helfen =) – Carlo

+2

Dies funktioniert, aber es ist nicht wahr, dass "Sie eine Abhängigkeitseigenschaft dafür benötigen." Sehen Sie Lösungen unten ... Sie benötigen lediglich eine Eigenschaft in Ihrem Viewmodell, an die Sie sich binden möchten. –

4

wenn Sie die Eigenschaft „MyProperty“ auf Ihre Daten-Klasse, dann binden Sie die IsChecked wie folgt .... (der Wandler ist optional, aber manchmal müssen Sie dass)

<Window.Resources> 
<local:MyBoolConverter x:Key="MyBoolConverterKey"/> 
</Window.Resources> 
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/> 
+6

definiert Wenn Ihre Immobilie bereits boolean ist, wird kein Konverter erforderlich. –

+0

yup, das ist warum sein "optional" :-) –

+0
60

Sie müssen Ihre Bindung bidirektional machen:

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/> 
+0

Danke Thomas, das hat es für mich sortiert, ich habe die Content-Eigenschaft verwendet. – Spidey

1

Sollte einfacher sein als das.Verwenden Sie einfach:

<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" /> 
8

Hallo dies mein erstes Mal veröffentlichen, so bitte geduldig: meine Antwort war eine einfache Eigenschaft zu erstellen:

 public bool Checked 
     { get; set; } 

Dann den Datenkontext des Checkbox zu setzen (so genannte CB1):

cb1.DataContext = this; 

Dann

die IsChecked proerty davon in der XAML zu binden,

Der Code ist wie folgt:

// the xaml 
 

 
<CheckBox x:Name="cb1" HorizontalAlignment="Left" 
 
     Margin="439,81,0,0" VerticalAlignment="Top" 
 
     Height="35" Width="96" IsChecked="{Binding Checked}"/> 
 
    
// the c# 
 

 
public partial class MainWindow : Window 
 
    { 
 
     public bool Checked 
 
     { get; set; } 
 
    
 

 
     public MainWindow() 
 
     { 
 
      InitializeComponent(); 
 

 
      cb1.DataContext = this; 
 
     } 
 

 
     private void myyButton_Click(object sender, RoutedEventArgs e) 
 
     { 
 

 
      MessageBox.Show(Checked.ToString()); 
 

 

 
     } 
 
    }

1

Dies funktioniert für mich (wesentliche Code nur enthalten, mehr für Ihre Bedürfnisse füllen):

In XAML eine Benutzersteuerung ist definiert:

<UserControl x:Class="Mockup.TestTab" ......> 
    <!-- a checkbox somewhere within the control --> 
    <!-- IsChecked is bound to Property C1 of the DataContext --> 
    <CheckBox Content="CheckBox 1" IsChecked="{Binding C1, Mode=TwoWay}" /> 
</UserControl> 

In Code hinter UserControl

public partial class TestTab : UserControl 
{ 
    public TestTab() 
    { 
     InitializeComponent(); // the standard bit 

    // then we set the DataContex of TestTab Control to a MyViewModel object 
    // this MyViewModel object becomes the DataContext for all controls 
     // within TestTab ... including our CheckBox 
     DataContext = new MyViewModel(....); 
    } 

} 

Irgendwo in Lösung Klasse MyViewModel

public class MyViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private bool m_c1 = true; 

    public bool C1 { 
     get { return m_c1; } 
     set { 
      if (m_c1 != value) { 
       m_c1 = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("C1")); 
      } 
     } 
    } 
}