【问题标题】:WPF Custom Control, DependencyProperty issueWPF 自定义控件,DependencyProperty 问题
【发布时间】:2011-07-10 04:49:59
【问题描述】:

我有一个带有自定义控件的测试代码设置:

/// <summary>
    /// Interaction logic for UCTest.xaml
    /// </summary>
    public partial class UCTest : UserControl
    {
        public static readonly DependencyProperty LastNameProperty =
       DependencyProperty.Register("LastName", typeof(string), typeof(UCTest),
      new PropertyMetadata("No Name", LastNameChangedCallback, LastNameCoerceCallback),
      LastNameValidateCallback);

        private static void LastNameChangedCallback(
             DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            Console.WriteLine(e.OldValue + " " + e.NewValue);
        }

        private static object LastNameCoerceCallback(DependencyObject obj, object o)
        {
            string s = o as string;
            if (s.Length > 8)
                s = s.Substring(0, 8);
            return s;
        }

        private static bool LastNameValidateCallback(object value)
        {
            return value != null;
        }


        public string LastName
        {
            get
            {
                return (string)GetValue(LastNameProperty);
            }
            set
            {
                SetValue(LastNameProperty, value);
            }
        }


        public UCTest()
        {
            InitializeComponent();
        }
    }

XAML 代码没有什么花哨的:

<UserControl ...>
    <Grid DataContext="{Binding}">

    </Grid>
</UserControl>

我的视图模型中的代码:

public class ViewModel : DependencyObject
    {
        public static readonly DependencyProperty LastNameProperty =
              DependencyProperty.Register("LastName", typeof(string), typeof(ViewModel));

        public string LastName
        {
            get
            {
                return (string)GetValue(LastNameProperty);
            }
            set
            {
                SetValue(LastNameProperty, value);
            }
        }
     }

MainWondow.XAML.cs 中的代码:

public MainWindow()
        {
            InitializeComponent();

            var viewModel = new ViewModel();
            DataContext = viewModel;

            viewModel.LastName = "asdf";

            viewModel.LastName = "56udfh";

            viewModel.LastName = "09ualkja";

        }

MainWindow.XAML 代码:

<Window...>
    <Grid>
        <CustomControlTest:UCTest LastName="{Binding LastName}"/>
    </Grid>
</Window>

我已经设置了断点并设置为“当命中”。输出(下图)显示该属性仅在“LastName”的最后一次执行时被更新。我希望它会在每次执行时调用 on 改变......有什么想法吗?

Step into: Stepping over non-user code 'CustomControlTest.App.App'
Step into: Stepping over non-user code 'CustomControlTest.App.InitializeComponent'
Function: CustomControlTest.UCTest.LastNameValidateCallback(object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameValidateCallback(object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameValidateCallback(object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameCoerceCallback(System.Windows.DependencyObject, object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameValidateCallback(object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameValidateCallback(object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameCoerceCallback(System.Windows.DependencyObject, object), Thread: 0x1DDC Main Thread
Function: CustomControlTest.UCTest.LastNameChangedCallback(System.Windows.DependencyObject, System.Windows.DependencyPropertyChangedEventArgs), Thread: 0x1DDC Main Thread
No Name 09ualkja

谢谢,

PS,这是我的 previous post 的后续问题。我想开始一个新的,因为真正的问题与我原来的帖子无关。 :)

【问题讨论】:

    标签: c# wpf .net-4.0 dependency-properties


    【解决方案1】:

    您的控件未加载到 MainWindow 构造函数中,因此尚未建立绑定。您可以通过在最后一个赋值、更改处理程序和构造函数末尾设置断点来检查这一点。你会看到构造函数完成,直到 UCTest 的属性发生变化。

    您可以通过使用 Dispatcher 延迟分配来解决此问题:

    this.Dispatcher.BeginInvoke((Action)(() =>
    {
        viewModel.LastName = "asdf";
    
        viewModel.LastName = "56udfh";
    
        viewModel.LastName = "09ualkja";
    }),
    DispatcherPriority.DataBind);
    

    【讨论】:

    • 谢谢。说得通!干杯:)
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多