WPF 数据绑定 CheckBox.IsChecked

Posted

技术标签:

【中文标题】WPF 数据绑定 CheckBox.IsChecked【英文标题】:WPF Databinding CheckBox.IsChecked 【发布时间】:2010-11-04 01:02:14 【问题描述】:

如何将 CheckBox 的 IsChecked 成员绑定到表单中的成员变量?

(我意识到我可以直接访问它,但我正在尝试了解数据绑定和 WPF)

以下是我未能成功的尝试。

XAML:

<Window x:Class="MyProject.Form1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Title" Height="386" Width="563" WindowStyle="SingleBorderWindow">
<Grid>
    <CheckBox Name="checkBoxShowPending" 
              TabIndex="2" Margin="0,12,30,0" 
              Checked="checkBoxShowPending_CheckedChanged" 
              Height="17" Width="92" 
              VerticalAlignment="Top" HorizontalAlignment="Right" 
              Content="Show Pending" IsChecked="Binding ShowPending">
    </CheckBox>
</Grid>
</Window>

代码:

namespace MyProject

    public partial class Form1 : Window
    
        private ListViewColumnSorter lvwColumnSorter;

        public bool? ShowPending
        
            get  return this.showPending; 
            set  this.showPending = value; 
        

        private bool showPending = false;

        private void checkBoxShowPending_CheckedChanged(object sender, EventArgs e)
        
            //checking showPending.Value here.  It's always false
        
    

【问题讨论】:

【参考方案1】:
<Window ... Name="MyWindow">
  <Grid>
    <CheckBox ... IsChecked="Binding ElementName=MyWindow, Path=ShowPending"/>
  </Grid>
</Window>

请注意,我为&lt;Window&gt; 添加了一个名称,并更改了 CheckBox 中的绑定。如果您希望它能够在更改时更新,您还需要将 ShowPending 实现为 DependencyProperty

【讨论】:

如果属性位于ViewModel 而不是View 本身,您将如何进行绑定? 如果使用 ViewModel,您通常会将 View(或 XAML)中的 DataContext 设置为 ViewModel,然后只需执行 IsChecked="Binding ShowPending"【参考方案2】:

@Will 回答的附录:这就是您的DependencyProperty 的样子(使用Dr. WPF's snippets 创建):

#region ShowPending

/// <summary>
/// ShowPending Dependency Property
/// </summary>
public static readonly DependencyProperty ShowPendingProperty =
    DependencyProperty.Register("ShowPending", typeof(bool), typeof(MainViewModel),
        new FrameworkPropertyMetadata((bool)false));

/// <summary>
/// Gets or sets the ShowPending property. This dependency property 
/// indicates ....
/// </summary>
public bool ShowPending

    get  return (bool)GetValue(ShowPendingProperty); 
    set  SetValue(ShowPendingProperty, value); 


#endregion

【讨论】:

【参考方案3】:

您必须将绑定模式设置为 TwoWay :

<Checkbox IsChecked="Binding Path=ShowPending, Mode=TwoWay"/>

【讨论】:

虽然 OneWay 是许多属性的默认设置,但 IsChecked 属性默认为 TwoWay。见Binding Overview【参考方案4】:

如果您只想将一个控件绑定到代码隐藏的属性,则可以通过RelativeSource 将其指定为绑定中的源,如下所示:

<CheckBox ...
IsChecked="Binding ShowPending, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=x:Type Window">

这可能是答案的结尾。但更一般地说,您将拥有多个控件并希望将它们绑定到您的类上的各种属性。在这种情况下,利用 DataContext 属性(这是数据绑定的默认源对象)通过控件层次结构向下继承这一事实更加简洁和方便,因此将其设置在顶层将使其可用于所有子控件。

DataContext 没有默认值,但至少有两种方法可以将 Window 元素的 DataContext 属性设置为指向自身:

通过在代码隐藏构造函数中设置DataContext = this。这非常简单,但有些人可能会争辩说,在 XAML 中并不清楚 DataContext 指向的位置。 通过使用 DataBinding 在 XAML 中设置 DataContext

在 XAML 中的 Window/UserControl 级别设置 DataContext 的最简单且我认为最优雅的方法非常简单;只需将 DataContext="Binding RelativeSource=RelativeSource Self" 添加到您的 Window 元素。 RelativeSource Self 仅表示“直接绑定到对象”,在本例中为 Window 对象。缺少Path 属性会导致默认Path,即源对象本身(即窗口)。

<Window x:Class="MyProject.Form1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="Binding RelativeSource=RelativeSource Self">
    <Grid>
        <CheckBox ... 
            IsChecked="Binding ShowPending">
        </CheckBox>
    </Grid>
</Window>

完成此操作后,所有子控件的 DataContext 属性将成为 Window 类,因此数据绑定到代码隐藏中的属性将很自然。

如果出于某种原因您不想在 Window 上设置 DataContext,但希望将其设置在控件层次结构的较低位置,那么您可以使用 FindAncestor 机制来实现。例如。如果你想在 Grid 元素和 Grid 的所有子元素上设置它:

<Grid DataContext="Binding RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=x:Type Window">
    <CheckBox ...
          IsChecked="Binding ShowPending">
    </CheckBox>
</Grid>

在这一点上可能值得注意的是,到目前为止,我们已经实现了将 UI 控件绑定到代码隐藏类的属性的能力,并使该代码隐藏属性保持最新对 UI 元素进行更改。因此,如果用户选中 CheckBox,ShowPending 属性将被更新。

但很多时候你也希望反过来是真的;对源属性的更改应反映在 UI 控件的相应更改中。您可以通过向窗口添加另一个 CheckBox 控件来查看这一点,该控件绑定到相同的 ShowPending 属性。当您单击一个复选框时,您可能希望或期望另一个复选框被同步,但它不会发生。要实现这一点,您的代码隐藏类应该 (a) 实现 INotifyPropertyChanged,(b) 添加 ShowPendingChanged 事件或 (c) 使 ShowPending 成为 Dependency Property。在这 3 个中,我建议在您的代码隐藏上实现 INotifyPropertryChanged 是最常见的机制。

【讨论】:

以上是关于WPF 数据绑定 CheckBox.IsChecked的主要内容,如果未能解决你的问题,请参考以下文章

WPF 10天修炼 第十天- WPF数据绑定

WPF 绑定

wpf path里的date属性可以直接绑定数据吗

WPF元素绑定

Wpf的comboBox怎么绑定数据?

WPF:概念绑定