【问题标题】:WPF C# Binding to TemplateInstance not workingWPF C# 绑定到 TemplateInstance 不起作用
【发布时间】:2015-02-05 10:10:19
【问题描述】:

我想将边框的光标绑定到我的 TemplateInstance 的私有属性。
XAML:

        <Border Cursor="{Binding ToggleCursor}">

C#:

        private Cursor ToggleCursor {
            get { 
                return IsEnabled ? Cursors.Hand : Cursors.Arrow;
            }
        }

我还在我的 TemplateClass 中实现了 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");
        }

是的,该类实现了接口。

问题是,边框永远不会从属性中获取值。
F.e.如果我在属性中返回Cursors.Cross,它仍然显示Cursors.Arrow
有什么想法吗?

示例:

这是一种具有动画行为的复选框,蓝色边框接收光标绑定。问题已解决 - 忘记设置 datacontext -__-

【问题讨论】:

  • 当您更改 IsEnabled 时,您是否正在提高 ToggleCursor 的属性更改
  • @pm_2 是的,请参阅我对 toadflakz 答案的评论
  • 您是否在此处创建自定义控件,并尝试根据该控件是否启用来更改 Border 元素的光标?
  • @NoelWidmer 您的控件源自哪个基本控件?使用自定义控件模板和触发器可能有一种更简单的方法来执行您想要的操作。
  • @StevenRands 来自控制

标签: c# wpf xaml binding


【解决方案1】:

无论您是重新模板化现有控件还是创建自己的控件,您都需要一个控件样式,并且还需要在该样式中设置一个控件模板。

在控件模板中,您可以使用触发器来更改内容:

<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>

那么您不需要在控件类中创建自定义属性来执行此操作。

【讨论】:

  • 没问题!但我喜欢用代码做大部分事情,因为在我看来它更容易维护。感谢您的附加信息:)
【解决方案2】:

ToggleCursor 必须是public 属性,并且您需要在ToggleCursor 属性值更改时调用OnPropertyChanged("ToggleCursor")(这似乎与IsEnabled 属性更改有关)。

通常这将通过重写的 OnPropertyChanged 方法:

private override void OnPropertyChanged(string PropertyName)
{
   base.OnPropertyChanged(PropertyName);
   switch (PropertyName)
   {
      case "IsEnabled":
          OnPropertyChanged("ToggleCursor");
          break;
   }
}

编辑:

OP 将ToggleCursor 属性设置为public,并为TemplateInstance 分配了DataContext,这解决了他的问题。

【讨论】:

  • 我也这样做:private void OnIsEnabledChanged() { OnPropertyChanged("ToggleCursor"); } 但是没有效果(方法订阅了事件)
  • ToggleCursor 必须public
  • 好的,好资源! :) - 还是不行,现在就去读
  • 如何将TemplateInstance 控件的DataContext 设置为TemplateClass 对象?
猜你喜欢
  • 2011-08-19
  • 2018-02-20
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多