WPF C# 绑定到 TemplateInstance 不起作用
WPF C# Binding to TemplateInstance not working
我想将边框光标绑定到我的模板实例的私有 属性。
XAML:
<Border Cursor="{Binding ToggleCursor}">
C#:
private Cursor ToggleCursor {
get {
return IsEnabled ? Cursors.Hand : Cursors.Arrow;
}
}
我还在我的模板类中实现了 INotifyPropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string PropertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
当然,我通知框架有关更改的信息:
(即使我不这样做,它仍然应该至少获得一次 属性)
IsEnabledChanged += (sender, e) => OnIsEnabledChanged();
和
private void OnIsEnabledChanged() {
OnPropertyChanged("ToggleCursor");
}
是的,class 实现了接口。
问题是,边框永远不会从 属性 中获取值。
F.e。如果我 return Cursors.Cross
在 属性 它仍然显示 Cursors.Arrow
.
有什么想法吗?
示例:
这是某种具有动画行为的复选框,蓝色边框接受光标绑定。问题已解决 - 忘记设置数据上下文 -__-
ToggleCursor
必须是 public
属性 并且只要 ToggleCursor
属性 值发生变化(这似乎与 IsEnabled
属性 变化有关)。
通常这将通过重写的 OnPropertyChanged 方法进行:
private override void OnPropertyChanged(string PropertyName)
{
base.OnPropertyChanged(PropertyName);
switch (PropertyName)
{
case "IsEnabled":
OnPropertyChanged("ToggleCursor");
break;
}
}
编辑:
OP 将 ToggleCursor
属性 设置为 public
并为 TemplateInstance
分配了 DataContext
,这解决了他的问题。
无论您是重新模板化现有控件还是创建自己的控件,您都需要一种控件样式,并且还需要在该样式中设置一个控件模板。
在控件模板中,您可以使用触发器来更改内容:
<Style TargetType="{x:Type YourCustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type YourCustomControl}">
<Border x:Name="Border">
... other elements, etc ...
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter TargetName="Border" Property="Cursor" Value="Hand" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
那么您不需要在您的控件 class 中创建自定义 属性 来执行此操作。
我想将边框光标绑定到我的模板实例的私有 属性。
XAML:
<Border Cursor="{Binding ToggleCursor}">
C#:
private Cursor ToggleCursor {
get {
return IsEnabled ? Cursors.Hand : Cursors.Arrow;
}
}
我还在我的模板类中实现了 INotifyPropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string PropertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
当然,我通知框架有关更改的信息:
(即使我不这样做,它仍然应该至少获得一次 属性)
IsEnabledChanged += (sender, e) => OnIsEnabledChanged();
和
private void OnIsEnabledChanged() {
OnPropertyChanged("ToggleCursor");
}
是的,class 实现了接口。
问题是,边框永远不会从 属性 中获取值。
F.e。如果我 return Cursors.Cross
在 属性 它仍然显示 Cursors.Arrow
.
有什么想法吗?
示例:
这是某种具有动画行为的复选框,蓝色边框接受光标绑定。问题已解决 - 忘记设置数据上下文 -__-
ToggleCursor
必须是 public
属性 并且只要 ToggleCursor
属性 值发生变化(这似乎与 IsEnabled
属性 变化有关)。
通常这将通过重写的 OnPropertyChanged 方法进行:
private override void OnPropertyChanged(string PropertyName)
{
base.OnPropertyChanged(PropertyName);
switch (PropertyName)
{
case "IsEnabled":
OnPropertyChanged("ToggleCursor");
break;
}
}
编辑:
OP 将 ToggleCursor
属性 设置为 public
并为 TemplateInstance
分配了 DataContext
,这解决了他的问题。
无论您是重新模板化现有控件还是创建自己的控件,您都需要一种控件样式,并且还需要在该样式中设置一个控件模板。
在控件模板中,您可以使用触发器来更改内容:
<Style TargetType="{x:Type YourCustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type YourCustomControl}">
<Border x:Name="Border">
... other elements, etc ...
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter TargetName="Border" Property="Cursor" Value="Hand" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
那么您不需要在您的控件 class 中创建自定义 属性 来执行此操作。