Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Для этого вам нужно свойство зависимости:

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 в его теге openning и использовать это имя в параметре ElementName.

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

EDIT:

Простым способом создания свойства зависимостей является написание фрагмента 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}"></Label>
      </StackPanel>     
    </Grid>
</Window>

С#:

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. И ярлык, и флажок привязаны к нему. Если флажок изменяется, метка тоже меняется.

Ответ 2

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

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

Ответ 3

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

        public bool Checked
        { get; set; }

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

cb1.DataContext = this;

Затем для привязки прокси-сервера IsChecked в xaml

IsChecked="{Binding Checked}"

Код выглядит следующим образом:

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


        }
    }

Ответ 4

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

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

Ответ 6

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

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

Ответ 7

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

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