我的UserControl中的DependencyProperty Set和Callback没有发生

我试图在WPF中创建一个简单的UserControl,以便在其他应用程序中重用。这是一个简单的DateRangePicker。控件的某些属性绑定到子UI元素,因此我实现了INotifyPropertyChanged。我的control.xaml.cs如下所示(仅相关部分)

public partial class DateRangePicker : UserControl,INotifyPropertyChanged
   {
      public DateRangePicker()
      {
         InitializeComponent();

         DataContext = this;
      }

      public event PropertyChangedEventHandler PropertyChanged;

      protected void RaisePropertyChangedEvent(string propertyName)
      {
         if (PropertyChanged != null)
         {
            var e = new PropertyChangedEventArgs(propertyName);
            PropertyChanged(this,e);
         }
      }


      public static readonly DependencyProperty InitialFromDateProperty =
         DependencyProperty.Register("InitialFromDate",typeof(DateTime),typeof(DateRangePicker),new PropertyMetadata(default(DateTime),new PropertyChangedCallback(OnInitialDateRangeChanged)));

      public static readonly DependencyProperty InitialToDateProperty =
         DependencyProperty.Register("InitialToDate",new PropertyChangedCallback(OnInitialDateRangeChanged)));

      public static readonly DependencyProperty SelectedFromDateProperty =
         DependencyProperty.Register("SelectedFromDate",null));

      public static readonly DependencyProperty SelectedToDateProperty =
         DependencyProperty.Register("SelectedToDate",null));


      public DateTime InitialFromDate
      {
         get { return (DateTime)Getvalue(InitialFromDateProperty); }
         set
         {
            Setvalue(InitialFromDateProperty,value);
         }
      }

      public DateTime InitialToDate
      {
         get { return (DateTime)Getvalue(InitialToDateProperty); }
         set
         {
            Setvalue(InitialToDateProperty,value);
         }
      }

      public DateTime SelectedFromDate
      {
         get { return (DateTime)Getvalue(SelectedFromDateProperty); }
         set
         {
            Setvalue(SelectedFromDateProperty,value);
         }
      }

      public DateTime SelectedToDate
      {
         get { return (DateTime)Getvalue(SelectedToDateProperty); }
         set
         {
            Setvalue(SelectedToDateProperty,value);
         }
      }

      private static void OnInitialDateRangeChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
      {
         DateRangePicker control = (DateRangePicker)d;
         control.RefreshLists();
      }

托管控件的我的Test应用程序xaml文件如下所示(包括名称空间的某些行已删除):


<Window x:Class="WpfApp3.MainWindow"
        xmlns:ControlDateRangePicker ="clr-namespace:SurfServer.Apps.Common.UI"
        xmlns:local="clr-namespace:WpfApp3"
        Title="MainWindow" Height="414.831" Width="565.808">
    <Grid>
        <ControlDateRangePicker:DateRangePicker
                        InitialFromDate="{Binding InitialFromDateVM,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
                        InitialToDate="{Binding InitialToDateVM,Mode=TwoWay}"
                        SelectedFromDate ="{Binding SelectedFromDateVM,Mode=TwoWay}"
                        SelectedToDate ="{Binding SelectedToDateVM,Mode=TwoWay}"
                        HorizontalAlignment="Left" Margin="136,78,0" VerticalAlignment="Top" Width="347"/>
    </Grid>
</Window>

我的测试应用程序xaml.cs看起来像这样


public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();
         try
         {
            var viewModel = new SampleViewModel();
            DataContext = viewModel;
            viewModel.Initialize();
         }
         catch (Exception)
         {
            Close();
         }
      }
   }

我的测试应用程序的ViewModel如下所示:

class SampleViewModel : ViewModelBase
   {

      private DateTime m_dtInitialFrom;
      public DateTime InitialFromDateVM
      {
         get => m_dtInitialFrom;
         set
         {
            m_dtInitialFrom = value;
            RaisePropertyChangedEvent(nameof(InitialFromDateVM));
         }
      }

      private DateTime m_dtInitialTo;
      public DateTime InitialToDateVM
      {
         get => m_dtInitialTo;
         set
         {
            m_dtInitialTo = value;
            RaisePropertyChangedEvent(nameof(InitialToDateVM));
         }
      }

      public DateTime SelectedFromDateVM
      {
         get;
         set;
      }

      public DateTime SelectedToDateVM
      {
         get;
         set;
      }

      public void Initialize()
      {
         InitialFromDateVM = new DateTime(DateTime.Now.Year - 1,DateTime.Now.Month,DateTime.Now.Day);
         InitialToDateVM = new DateTime(DateTime.Now.Year,DateTime.Now.Day);
      }

如您所见,测试应用程序的View模型中的某些属性绑定到我控件的(DateRangePicker)依赖项属性。 现在我面临的问题是,尽管我试图在测试应用程序的ViewModel中(在Initialize方法中)设置Initial值,但看起来绑定不起作用,并且控件中没有回调(实际上是) ,甚至连依赖项属性本身的“集合”也无法显示。我在这里想做错什么?

Z20070230326 回答:我的UserControl中的DependencyProperty Set和Callback没有发生

您必须从DataContext构造函数中删除设置DateRangePicker。因此,您的UserControl的DataContext不是您的ViewModel SampleViewModel,而是UserControl本身。

public partial class DateRangePicker : UserControl,INotifyPropertyChanged
{
      public DateRangePicker()
      {
         InitializeComponent();

         //DataContext = this; REMOVE
      }
}
本文链接:https://www.f2er.com/3144347.html

大家都在问