developer tip

WPF 확인란 바인딩

copycodes 2020. 10. 29. 08:17
반응형

WPF 확인란 바인딩


체크 박스의 Click 이벤트를 사용하여 체크 박스의 체크 상태를 변수에 저장하는 것은 간단하지만 데이터 바인딩을 통해 어떻게 할 수 있습니까? 내가 찾은 모든 예제는 일부 데이터 소스에서 UI를 업데이트하거나 한 컨트롤을 다른 컨트롤에 바인딩했습니다. 체크 박스를 클릭하면 멤버 변수를 업데이트하고 싶습니다.

모든 포인터에 대한 TIA ...


이에 대한 종속성 속성이 필요합니다.

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}" />

작동하려면 여는 태그에서 Window 또는 UserControl의 이름을 지정하고 ElementName 매개 변수에서 해당 이름을 사용해야합니다.

이 코드를 사용하면 코드 측에서 속성을 변경할 때마다 텍스트 상자가 변경됩니다. 또한 텍스트 상자를 선택 / 선택 취소 할 때마다 Dependency Property도 변경됩니다.

편집하다:

종속성 속성을 만드는 쉬운 방법은 코드 조각 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>

씨#:

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 속성을 바인딩하려면

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}}"/>

Here is a post that shows an example of simple data binding to a IsChecked property of a two check boxes, which are mutually exclusive.

http://www.helplessautomation.com/2011/01/wpf-coding-mutually-exclusive-check-boxes-with-data-binding/

Hope that helps.


Should be easier than that. Just use:

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

This works for me (essential code only included, fill more for your needs):

In XAML a user control is defined:

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

In code behind for 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(....);
    }

}

Somewhere in solution class MyViewModel is defined

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

참고URL : https://stackoverflow.com/questions/870163/wpf-checkbox-binding

반응형