Привязка флажка WPF

Хотя сохранить отмеченное состояние флажка в переменной с помощью события Click флажка - тривиально, как мне это сделать с помощью привязки данных? Во всех найденных мною примерах пользовательский интерфейс обновляется из некоторого источника данных или связывается один элемент управления с другим; Я хочу обновить переменную-член, когда установлен флажок.

TIA для любых указателей ...


person Number8    schedule 15.05.2009    source источник


Ответы (6)


Для этого вам понадобится свойство зависимости:

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

Как только это будет сделано, вы привяжете флажок к свойству зависимости:

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

Чтобы это работало, вы должны назвать свое окно или UserControl в его теге открытия и использовать это имя в параметре ElementName.

С помощью этого кода всякий раз, когда вы изменяете свойство на стороне кода, вы изменяете текстовое поле. Кроме того, всякий раз, когда вы устанавливаете / снимаете отметку с текстового поля, свойство Dependency также изменится.

РЕДАКТИРОВАТЬ:

Простой способ создать свойство зависимости - набрать фрагмент propdp, который даст вам общий код для свойств зависимости.

Весь код:

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}" />
        </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();
        }
    }
}

Обратите внимание, что за единственным кодом находится свойство Dependency. К нему привязаны и метка, и флажок. Если флажок изменится, метка также изменится.

person Carlo    schedule 15.05.2009
comment
Спасибо за ответ. Похоже, что ElementName был недостающим ключевым ингредиентом. - person Number8; 16.05.2009
comment
Это сработает, но неверно, что для этого вам нужно свойство зависимости. См. Решения ниже ... все, что вам нужно, это свойство вашей модели просмотра, к которому нужно привязаться. - person Randy Gamage; 12.09.2013

Вы должны сделать привязку двунаправленной:

<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
person Thomas Levesque    schedule 15.05.2009
comment
Спасибо, Томас, что отсортировал для меня, я использовал свойство Content. - person Spidey; 08.02.2010

Здравствуйте, это моя первая публикация, поэтому проявите терпение: мой ответ заключался в создании простого свойства:

public bool Checked { get; set; }

Затем, чтобы установить контекст данных флажка (называемого cb1):

cb1.DataContext = this;

Затем, чтобы привязать его свойство IsChecked в xaml

IsChecked="{Binding Checked}"

Код такой:

XAML

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

Код позади

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());
    }
}
person abraham camhy    schedule 02.06.2015

если у вас есть свойство MyProperty в вашем классе данных, вы привязываете IsChecked следующим образом .... (конвертер не является обязательным, но иногда он вам нужен)

<Window.Resources>
<local:MyBoolConverter x:Key="MyBoolConverterKey"/>
</Window.Resources>
<checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
person Muad'Dib    schedule 15.05.2009
comment
да, вот почему это необязательно :-) - person Muad'Dib; 15.05.2009
comment
‹Checkbox IsChecked = {Binding Path = Checked, Mode = TwoWay} public bool Checked {get {return _isChecked;} set {_isChecked = value;}} Без радости; _isChecked никогда не изменяется. - person Number8; 16.05.2009
comment
тогда проверьте свой DataContext, я использую его сам, и он работает как шарм. - person Muad'Dib; 16.05.2009

Должно быть проще, чем это. Просто используйте:

<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
person Tim W    schedule 11.06.2014

Это работает для меня (включен только основной код, заполните больше для ваших нужд):

В XAML определяется пользовательский элемент управления:

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

В коде для 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(....);
    }

}

Где-то в решении класс 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"));
            }
        }
    }
}
person pjm    schedule 24.06.2015