Флажок привязки WPF
хотя тривиально хранить отмеченное состояние флажка в переменной, используя событие щелчка флажка, как бы я это сделал с помощью привязки данных? Все примеры, которые я нашел, обновляют пользовательский интерфейс из некоторого источника данных или привязывают один элемент управления к другому; я хочу обновить переменную-член при нажатии флажка.
TIA для любых указателей...
7 ответов:
вам нужно свойство зависимости для этого:
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.
С помощью этого кода, всякий раз, когда вы изменяете свойство на стороне кода, Вы измените текстовое поле. Кроме того, всякий раз, когда вы устанавливаете / снимаете флажок с текстового поля, свойство зависимостей будет изменяться тоже.
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}" /> </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(); } } }
обратите внимание, что единственным кодом является свойство зависимостей. И метка, и флажок привязаны к нему. Если флажок изменится, метка тоже изменится.
вы должны сделать привязку двунаправленной:
<checkbox IsChecked="{Binding Path=MyProperty, Mode=TwoWay}"/>
Привет это моя первая публикация, поэтому, пожалуйста, будьте терпеливы: мой ответ состоял в том, чтобы создать простое свойство:
public bool Checked { get; set; }
затем, чтобы установить контекст данных флажка (называется cb1):
cb1.DataContext = this;
затем привязать небольшом городке этот флажок установлен его в 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()); } }
если у вас есть свойство "MyProperty" на вашем классе данных, то вы связываете IsChecked вот так.... (конвертер не является обязательным, но иногда вам это нужно)
<Window.Resources> <local:MyBoolConverter x:Key="MyBoolConverterKey"/> </Window.Resources> <checkbox IsChecked="{Binding Path=MyProperty, Converter={StaticResource MyBoolConverterKey}}"/>
вот сообщение, которое показывает пример простой привязки данных к свойству IsChecked двух флажков, которые являются взаимоисключающими.
надеюсь, что это поможет.
должно быть проще, чем это. Просто используйте:
<Checkbox IsChecked="{Binding Path=myVar, UpdateSourceTrigger=PropertyChanged}" />
это работает для меня (существенный код только включен, заполните больше для ваших нужд):
в 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")); } } } }