一种依赖性 属性 更改通知的方式

One way dependency property changed notification

我正在尝试创建一个具有依赖性的用户控件 属性。当从用户控件外部更改依赖项 属性 时,我需要执行某些逻辑,但是当从用户控件内部更改依赖项 属性 时,不应执行该逻辑。我有这个小样本。我只想在从主窗口设置值时执行某些逻辑,而不是在通过单击复选框设置值时执行。我不知道 PropertyChangedCallback 是否正确,但这是我的方法。

用户控件:

public partial class UserControl1 : UserControl
{
    public int MyProperty
    {
        get { return (int)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(int), typeof(UserControl1), new PropertyMetadata(new PropertyChangedCallback(OnPropertyChanged)));

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Only process the 5, don't process the 6
    }


    public UserControl1()
    {
        InitializeComponent();
    }

    private void checkBox_Click(object sender, RoutedEventArgs e)
    {
        MyProperty = 6;
    }
}

用户控件xaml:

<UserControl x:Class="WpfApplication4.UserControl1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <CheckBox x:Name="checkBox" Click="checkBox_Click"/>
    </Grid>
</UserControl>

主窗口:

public partial class MainWindow : Window
    {
        public int MainWindowProperty { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            MainWindowProperty = 5;
        }
    }

主窗口xaml:

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication4"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:UserControl1 MyProperty="{Binding MainWindowProperty}"/>
    </Grid>
</Window>
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (!disableProcessing)
    {
        // Only process the 5, don't process the 6
    }
}

bool disableProcessing = false;
private void checkBox_Click(object sender, RoutedEventArgs e)
{
    disableProcessing = true;
    MyProperty = 6;
    disableProcessing = false;
}