如何将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
}
}
}
答案 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中并不清楚。 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
是最常见的机制。