Я хочу привязать курсор границы к частной собственности моего 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 -__-
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
, и это решило его проблему.
Независимо от того, изменяете ли вы шаблон существующего элемента управления или создаете свой собственный, вам нужен стиль элемента управления, а также необходимо установить шаблон элемента управления внутри этого стиля.
В шаблоне элемента управления вы можете использовать триггер для изменения вещей:
<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>
Тогда вам не нужно создавать настраиваемое свойство в вашем классе управления для этого.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.