Привязка флажка WPF
В то время как тривиально хранить состояние, отмеченное флажком, в переменной, используя флажок "Событие Click", как мне это сделать с помощью привязки данных? Все примеры, которые я нашел, обновили пользовательский интерфейс от некоторого источника данных или привязали один элемент управления к другому; Я хочу обновить переменную-член при щелчке по флажку.
TIA для любых указателей...
Ответы
Ответ 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}}"/>
Ответ 5
Вот сообщение, в котором показан пример простой привязки данных к свойству IsChecked из двух флажков, которые являются взаимоисключающими.
http://www.helplessautomation.com/2011/01/wpf-coding-mutually-exclusive-check-boxes-with-data-binding/
Надеюсь, что это поможет.
Ответ 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"));
}
}
}
}