我的项目中有这个xaml:
<UserControl x:Class="MyControl"
... x:Name="Control">
<Grid x:Name="DetailsGrid" > // <-- I set the data object on this in code
<Button x:Name="IconBtn" IsEnabled="{Binding IsEditing, ElementName=Control}"
Style="{DynamicResource ImageButton}" Click="IconBtn_Click" >
...
<Grid>
</UserControl>
我在IsEditing
类中定义了MyControl
依赖属性。
namespace MyNamespace
{
public partial class MyControl : UserControl, INotifyPropertyChanged
{
...
public bool IsEditing { get; set; }
....
}
}
上述代码无法启用/禁用IconBtn
按钮。
但以下绑定IsEnabled="{Binding Control.IsEditing}"
的工作原理。
<UserControl x:Class="MyControl"
... x:Name="Control">
<Grid x:Name="DetailsGrid" > // <-- I set the data object on this in code
<Button x:Name="IconBtn" IsEnabled="{Binding Control.IsEditing}"
Style="{DynamicResource ImageButton}" Click="IconBtn_Click" >
...
<Grid>
</UserControl>
请告诉我
之间的区别IsEnabled="{Binding IsEditing, ElementName=Control}"
和
IsEnabled="{Binding Control.IsEditing}"
我是WPF和C#的新手。
修改 但这适用于同一个xaml的其他部分:
IsReadOnly="{Binding IsEditing ElementName=Control}"
答案 0 :(得分:1)
在绑定表达式中使用Path
将在DataContext
中搜索它,而不是在控件属性中搜索它。如果要直接绑定到控件的属性,则必须使用ElementName
语法指定它。当您编写{Binding Control.IsEditing}
之类的内容时,WPF会默认搜索您的控件的DataContext
以获取名为“Control”的属性,但显然无法找到该属性。
另一种方法是将DataContext
设置为控件本身。这可以在构造函数中轻松完成。
阅读您的评论,如果您正在DataContext = this
,那么您的DataContext
已经设置为控件本身。在这种情况下,您应该只使用{Binding IsEditing}
,即您无需指定ElementName
或限定Control.IsEditing
之类的路径。如果您使用Control.
限定路径,WPF将尝试在控件中找到名为Control
的属性,这显然不存在。
总而言之,您有3个选择:
x:Name
并使用{Binding IsEditing, ElementName=XNAME_OF_YOUR_CONTROL}
语法。此选项不要求您在构造函数中设置DataContext
。x:Name
,设置DataContext(DataContext = this;
)并使用语法{Binding IsEditing}
。RelativeSource={RelativeSource AncestorType=UserControl}
与Path=IsEditing
。