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 中创建自定义 属性 来执行此操作。