1. ホーム
  2. c#

[解決済み] WPFチェックボックスバインディング

2023-05-11 01:34:34

質問

チェックボックスのチェック状態をチェックボックスのクリックイベントを使用して変数に格納するのは簡単ですが、データバインディングでそれを行うにはどうしたらよいでしょうか。 私が見つけたすべての例では、UI が何らかのデータ ソースから更新されるか、1 つのコントロールを別のコントロールにバインドしていました。

ポインターのために 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));

これができたら、チェックボックスをdependencyプロパティにバインドします。

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

この機能を使用するには、Window または UserControl の開始タグに名前を付け、ElementName パラメータにその名前を使用する必要があります。

このコードでは、コード側でプロパティを変更するたびに、テキストボックスが変更されます。また、テキストボックスのチェックを外すと、Dependency Propertyも変化します。

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

後ろにある唯一のコードが依存性プロパティであることに注目してください。ラベルとチェックボックスの両方がこのプロパティにバインドされています。チェックボックスが変更されると、ラベルも変更されます。