代码之家  ›  专栏  ›  技术社区  ›  Adam Tegen

WPF数据绑定复选框.ischecked

  •  7
  • Adam Tegen  · 技术社区  · 15 年前

    如何将复选框的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 回复  |  直到 6 年前
        1
  •  12
  •   Will Eddins    15 年前
    <Window ... Name="MyWindow">
      <Grid>
        <CheckBox ... IsChecked="{Binding ElementName=MyWindow, Path=ShowPending}"/>
      </Grid>
    </Window>
    

    注意,我在 <Window> ,并更改了复选框中的绑定。您需要将ShowPending作为 DependencyProperty 如果您希望它能够在更改时更新。

        2
  •  2
  •   Pat    14 年前

    @will's answer的附录:这就是 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
  •  0
  •   itzmebibin    8 年前

    您必须将绑定模式设置为两种方式:

    <Checkbox IsChecked="{Binding Path=ShowPending, Mode=TwoWay}"/>
    
        4
  •  0
  •   Rob    6 年前

    如果只有一个控件要绑定到代码隐藏的属性,则可以通过 RelativeSource 这样地:

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

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

    没有默认值 数据上下文 但至少有两种方法可以设置 数据上下文 窗口元素的属性以指向自身:

    • 通过设置 DataContext = this 在代码隐藏构造函数中。这很简单,但有些人可能会争辩说,在DataContext所指向的XAML中并不清楚。
    • 通过设置 数据上下文 在使用数据绑定的XAML中

    在XAML中,将DataContext设置为Window/UserControl级别的最简单、最优雅的方法是非常直接的;只需添加 DataContext="{Binding RelativeSource={RelativeSource Self}}" 对你 Window 元素。 RelativeSource Self 只表示“直接绑定到对象”,在本例中是 窗口 对象。缺少A 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>
    

    一旦你做到了这一点, 数据上下文 所有子控件的属性将是 窗口 类,因此数据绑定到代码中的属性是自然的。

    如果出于某种原因您不想设置 数据上下文 在窗口上,但希望将其设置为更低的控件层次结构,然后可以使用 FindAncestor 机制。例如,如果要在网格元素和网格的所有子元素上设置它:

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

    现在可能值得注意的是,到目前为止,我们所取得的成就是能够将UI控件绑定到代码隐藏类的属性,并且使代码隐藏属性随着UI元素的更改而保持最新。因此,如果用户选中复选框, ShowPending 将更新属性。

    但通常情况下,您也希望反转为true;对源属性的更改应反映在对UI控件的相应更改中。您可以通过向窗口添加另一个复选框控件(绑定到该控件)来查看此问题。 炫耀 财产。当您单击一个复选框时,您可能希望或期望另一个复选框同步,但不会发生这种情况。为了实现这一点,您的代码隐藏类应该(a)实现 INotifyPropertyChanged ,(b)添加一个 ShowPendingChanged 事件或(c)制造 炫耀 Dependency Property . 在这三项中,我建议实施 INotifyPropertryChanged 在您的代码后面是最常见的机制。