Я пытаюсь понять свойство зависимости и научиться его использовать. Я просматриваю статьи, и в этой статье https://www.c-sharpcorner.com/UploadFile/6d590d/wpf-dependency-property/ есть такой пример:
MainWindow.xaml:
<Window x:Class="WpfApplication1.DependencyPropertyDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="DependencyPropertyDemo" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<local:CarDependencyClass x:Key="carDependencyClass"></local:CarDependencyClass>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label Content="Enter Car:" Grid.Row="0" VerticalAlignment="Center" />
<TextBox Text="{Binding Path=MyCar, Source={StaticResource carDependencyClass }}" Name="MyTextCar" Height="25" Width="150" />
<Button Name="MyButton" Content="Click Me!" Height="25" Click="MyButton_Click" Width="150" Grid.Row="1" />
</Grid>
</Window>
MainWindow.xaml.cs:
using System.Windows;
namespace WpfApplication1 {
/// <summary>
/// Interaction logic for DependencyPropertyDemo.xaml
/// </summary>
public partial class DependencyPropertyDemo : Window {
public DependencyPropertyDemo() {
InitializeComponent();
}
private void MyButton_Click(object sender, RoutedEventArgs e) {
CarDependencyClass dpSample = TryFindResource("carDependencyClass") as CarDependencyClass;
MessageBox.Show(dpSample.MyCar);
}
}
public class CarDependencyClass : DependencyObject {
//Register Dependency Property
public static readonly DependencyProperty CarDependencyProperty = DependencyProperty.Register("MyProperty", typeof(string), typeof(CarDependencyClass));
public string MyCar {
get {
return (string)GetValue(CarDependencyProperty);
}
set {
SetValue(CarDependencyProperty, value);
}
}
}
}
Работает. Я заметил, что они зарегистрировали свойство зависимости с именем «MyProperty» и что оно нигде в программе не используется. В xaml используется только обычное свойство среды CLR MyCar.
Но есть еще одна статья https://www.c-sharpcorner.com/article/simplest-wpf-dependency-property-for-beginners-on-background-color/. И они предоставляют другой пример:
MainWindow.xaml:
<Window x:Class="DependencyPropertyTutorial.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:views="clr-namespace:DependencyPropertyTutorial" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DependencyPropertyTutorial" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="BG" Color="Green" />
</Window.Resources>
<Grid>
<views:CustomButtonControl SetBackground="{DynamicResource BG}"></views:CustomButtonControl>
</Grid>
</Window>
CustomButtonControl.xaml:
<UserControl x:Class="DependencyPropertyTutorial.CustomButtonControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:DependencyPropertyTutorial"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<Button x:Name="btnCustom" Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Height="52" Click="btnCustom_Click" />
</Grid>
</UserControl>
CustomButtonControl.xaml.cs:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace DependencyPropertyTutorial {
/// <summary>
/// Interaction logic for CustomButtonControl.xaml
/// </summary>
public partial class CustomButtonControl : UserControl {
public CustomButtonControl() {
InitializeComponent();
}
public static readonly DependencyProperty btnDependencyProperty = DependencyProperty.Register("SetBackground", typeof(SolidColorBrush), typeof(CustomButtonControl), new PropertyMetadata(new SolidColorBrush(Colors.HotPink), new PropertyChangedCallback(OnSetColorChanged)));
public SolidColorBrush SetBackground {
set {
SetValue(btnDependencyProperty, value);
}
get {
return (SolidColorBrush)GetValue(btnDependencyProperty);
}
}
private void btnCustom_Click(object sender, RoutedEventArgs e) {
this.SetBackground = new SolidColorBrush(Colors.IndianRed);
}
private static void OnSetColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
CustomButtonControl mycontrol = d as CustomButtonControl;
mycontrol.callmyInstanceMethod(e);
}
private void callmyInstanceMethod(DependencyPropertyChangedEventArgs e) {
btnCustom.Background = (SolidColorBrush)e.NewValue;
}
}
}
И здесь они регистрируют свойство зависимости с именем "SetBackground", которое в точности совпадает с именем свойства CLR - SetBackground. И если я изменю свойство зависимости (то, которое я зарегистрировал с помощью метода Register) «SetBackground» на что-то другое, например «SetBackgroundDependencyProperty», то при попытке запустить приложение я получаю исключение XAML. Но свойство зависимостей SetBackground нигде даже не упоминается в xaml. Только свойство CLR SetBackground упоминается в XAML в строке
<views:CustomButtonControl SetBackground="{DynamicResource BG}"></views:CustomButtonControl>
Я также получаю сообщение об ошибке в Visual Studio в этом примере: ![enter image description here](https://i.stack.imgur.com/jdSAB.png)
Но когда я пытаюсь собрать и запустить приложение, оно работает.
Итак, у меня следующие вопросы: почему в первом примере им не нужно было называть зарегистрированное свойство зависимости так же, как свойство CLR, но во втором примере я должен назвать зарегистрированное свойство зависимости так же, как свойство CLR. Есть ли способ назвать зарегистрированное свойство зависимостей иначе, чем свойство CLR во втором примере? Почему и как xaml даже использует свойства зависимостей, учитывая, что xaml все равно ссылается только на свойства CLR? Я проверил это, и в обоих проектах только на свойства CLR ссылаются из XAML, согласно VS IntelliSense. Почему мне нужно регистрировать свойство зависимости с тем же именем, что и свойство CLR - «SetBackground», когда в xaml указывается только свойство CLR, и оно все равно возвращает SolidColorBru sh из свойства зависимости:
return (SolidColorBrush)GetValue(btnDependencyProperty);
Вот решение для обоих примеров: https://github.com/KulaGGin/DependencyProperty