WPF数据绑定CheckBox.IsChecked

时间:2009-06-18 15:27:48

标签: wpf data-binding checkbox

如何将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
        }
    }
}

4 个答案:

答案 0 :(得分:12)

<Window ... Name="MyWindow">
  <Grid>
    <CheckBox ... IsChecked="{Binding ElementName=MyWindow, Path=ShowPending}"/>
  </Grid>
</Window>

注意我为<Window>添加了一个名称,并更改了CheckBox中的绑定。如果您希望ShowPending能够在更改时更新,则需要将其实现为DependencyProperty

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您只有一个控件要绑定到代码隐藏的属性,那么您可以通过这样的RelativeSource将其指定为绑定中的源:

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

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

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

  • 在代码隐藏构造函数中设置DataContext = this。这很简单,但有些人可能认为在DataContext指向的XAML中并不清楚。
  • 通过使用DataBinding
  • 在XAML中设置DataContext

在XAML中在Window / UserControl级别设置DataContext的最简单,也是最优雅的方式非常简单;只需将DataContext="{Binding RelativeSource={RelativeSource Self}}"添加到您的Window元素即可。 RelativeSource Self只是意味着&#34;直接绑定到对象&#34;,在这种情况下是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类,因此绑定到代码隐藏中的属性的数据将是自然的。

如果由于某种原因你不想在窗口上设置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是最常见的机制。