Прив'язка прапорця WPF


77

Незважаючи на те, що тривіально зберігати перевірений стан прапорця у змінній, використовуючи подію Click checkbox, як мені це зробити за допомогою прив'язки даних? Усі приклади, які я знайшов, оновлюють інтерфейс користувача з деяких джерел даних або прив’язують один елемент керування до іншого; Я хочу оновити змінну члена, коли встановлено прапорець.

TIA для будь-яких покажчиків ...

Відповіді:


53

Для цього вам потрібна властивість залежності:

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.

За допомогою цього коду, коли ви змінюєте властивість на стороні коду, ви змінюєте текстове поле. Крім того, кожного разу, коли ви ставите / знімаєте прапорець біля текстового поля, властивість залежності також змінюватиметься.

РЕДАГУВАТИ:

Простий спосіб створити властивість залежності - це набрати фрагмент 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. І ярлик, і прапорець прив’язані до нього. Якщо прапорець змінюється, мітка також змінюється.


1
Дякую за відповідь. Здається, "ElementName" був відсутнім ключовим інгредієнтом.
Номер 8

6
Це буде працювати, але неправда, що "для цього вам потрібна властивість залежності". Дивіться рішення нижче ... все, що вам потрібно, це властивість на вашому viewmodel, до якого потрібно прив’язати.
Randy Gamage

83

Потрібно зробити двосторонній прив’язок:

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

Дякую Томасу, що сортував це для мене, я використовував властивість Content.
Spidey

13

Привіт, це моя перша публікація, тому будьте терплячі: моя відповідь полягала у створенні простої властивості:

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

4

якщо у вас є властивість "MyProperty" у вашому класі даних, тоді ви прив'язуєте IsChecked так .... (перетворювач необов'язковий, але іноді це потрібно)

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

так, ось чому його "необов’язково" :-)
Muad'Dib

<checkbox IsChecked = "{Binding Path = Checked, Mode = TwoWay}" public bool Перевірено {get {return _isChecked;} set {_isChecked = value;}} Без радості; _isChecked ніколи не змінюється.
Номер 8

перевірте ваш DataContext, тоді я сам використовую це, і це працює як шарм.
Муад'Діб

2

Це має бути простіше. Просто використовуйте:

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

1

Це працює для мене (необхідний код включений, заповніть більше для своїх потреб):

У 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"));
            }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.