Я хочу привязать курсор границы к частной собственности моего TemplateInstance.
XAML:

        <Border Cursor="{Binding ToggleCursor}">

C #:

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

Я также реализовал INotifyPropertyChanged в своем TemplateClass:

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

-1
Noel Widmer 5 Фев 2015 в 13:10

2 ответа

Лучший ответ

ToggleCursor должен быть свойством public, и вам необходимо вызывать OnPropertyChanged("ToggleCursor") при изменении значения свойства ToggleCursor (что, похоже, связано с изменениями свойства IsEnabled).

Обычно это происходит с помощью переопределенного метода OnPropertyChanged:

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

Изменить:

OP установил для свойства ToggleCursor значение public, а также назначил DataContext для TemplateInstance, и это решило его проблему.

0
toadflakz 5 Фев 2015 в 10:32

Независимо от того, изменяете ли вы шаблон существующего элемента управления или создаете свой собственный, вам нужен стиль элемента управления, а также необходимо установить шаблон элемента управления внутри этого стиля.

В шаблоне элемента управления вы можете использовать триггер для изменения вещей:

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

Тогда вам не нужно создавать настраиваемое свойство в вашем классе управления для этого.

1
Steven Rands 5 Фев 2015 в 10:32