Liên kết hộp kiểm WPF


77

Mặc dù việc lưu trữ trạng thái đã chọn của hộp kiểm trong một biến là điều tầm thường bằng cách sử dụng sự kiện Nhấp chuột của hộp kiểm, nhưng tôi sẽ làm điều đó như thế nào thông qua Databinding? Tất cả các ví dụ tôi đã tìm thấy đều có giao diện người dùng được cập nhật từ một số nguồn dữ liệu hoặc ràng buộc một điều khiển này với một điều khiển khác; Tôi muốn cập nhật một biến thành viên khi hộp kiểm được nhấp vào.

TIA cho bất kỳ con trỏ nào ...

Câu trả lời:


53

Bạn cần một thuộc tính phụ thuộc cho việc này:

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

Sau khi hoàn tất, bạn liên kết hộp kiểm với thuộc tính phụ thuộc:

<CheckBox x:Name="myCheckBox"
          IsChecked="{Binding ElementName=window1, Path=CheckBoxIsChecked}" />

Để điều đó hoạt động, bạn phải đặt tên Window hoặc UserControl của mình trong thẻ mở của nó và sử dụng tên đó trong tham số ElementName.

Với mã này, bất cứ khi nào bạn thay đổi thuộc tính ở phía mã, bạn sẽ thay đổi hộp văn bản. Ngoài ra, bất cứ khi nào bạn chọn / bỏ chọn hộp văn bản, Thuộc tính Phụ thuộc cũng sẽ thay đổi.

BIÊN TẬP:

Một cách dễ dàng để tạo thuộc tính phụ thuộc là nhập đoạn mã propdp, đoạn mã này sẽ cung cấp cho bạn mã chung cho Thuộc tính phụ thuộc.

Tất cả các mã:

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

Lưu ý rằng mã duy nhất phía sau là Thuộc tính Phụ thuộc. Cả nhãn và hộp kiểm đều bị ràng buộc với nó. Nếu hộp kiểm thay đổi, nhãn cũng thay đổi.


1
Cảm ơn vi đa trả lơi. Có vẻ như "ElementName" là thành phần quan trọng bị thiếu.
Number8

6
Điều này sẽ hoạt động, nhưng không đúng khi "bạn cần một thuộc tính phụ thuộc cho việc này." Xem các giải pháp bên dưới ... tất cả những gì bạn cần là một thuộc tính trên mô hình xem của bạn để liên kết.
Randy Gamage

83

Bạn phải thực hiện ràng buộc của mình hai chiều:

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

Cảm ơn Thomas, điều đó đã sắp xếp cho tôi, tôi đang sử dụng thuộc tính Nội dung.
Spidey

13

Xin chào, đây là lần đầu tiên tôi đăng bài nên hãy kiên nhẫn: câu trả lời của tôi là tạo một thuộc tính đơn giản:

public bool Checked { get; set; }

Sau đó, để đặt ngữ cảnh dữ liệu của Hộp kiểm (được gọi là cb1):

cb1.DataContext = this;

Sau đó, để ràng buộc quyền sở hữu IsChecked của nó trong xaml

IsChecked="{Binding Checked}"

Mã như thế này:

XAML

<CheckBox x:Name="cb1"
          HorizontalAlignment="Left"
          Margin="439,81,0,0"
          VerticalAlignment="Top"
          Height="35" Width="96"
          IsChecked="{Binding Checked}"/>

Mã ẩn

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

nếu bạn có thuộc tính "MyProperty" trên lớp dữ liệu của mình, thì bạn liên kết IsChecked như thế này .... (trình chuyển đổi là tùy chọn, nhưng đôi khi bạn cần điều đó)

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

vâng, đó là lý do tại sao "tùy chọn" của nó :-)
Muad'Dib

<checkbox IsChecked = "{Binding Path = Checked, Mode = TwoWay}" public bool Checked {get {return _isChecked;} set {_isChecked = value;}} Không vui; _isChecked không bao giờ thay đổi.
Number8

sau đó hãy kiểm tra DataContext của bạn, bản thân tôi đang sử dụng cái này và nó hoạt động như một cái duyên.
Muad'Dib

2

Nên dễ dàng hơn thế. Chỉ dùng:

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

1

Điều này phù hợp với tôi (chỉ bao gồm mã cần thiết, hãy điền thêm cho nhu cầu của bạn):

Trong XAML, điều khiển người dùng được xác định:

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

Trong mã phía sau cho 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(....);
    }

}

Ở đâu đó trong lớp giải pháp MyViewModel được định nghĩa

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.