WPF自定义控件依赖项属性设置器没有被调用?

时间:2014-09-03 16:57:34

标签: wpf dependency-properties

我创建了一个继承自TextBox类的自定义控件CustomTextBox。我创建了一个名为CustomTextProperty的依赖项属性。

我已将此DP与我的Viewmodel属性捆绑在一起。

注册DP时,我已经给出了属性更改回调,但只有当我的控件在我的xaml加载时获取绑定数据时,才会调用它一次。

当我尝试从视图设置我的控件时,不会调用绑定的VM属性设置器,也不会触发propertychangecallback。

请帮助!!

下面的代码snipet:

我的自定义控件

class CustomTextBox : TextBox
{
  public static readonly DependencyProperty CustomTextProperty = DependencyProperty.Register("CustomText",
                                                               typeof(string), typeof(CustomTextBox),
                                                               new FrameworkPropertyMetadata("CustomTextBox",
                                                               FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                                                               new PropertyChangedCallback(OnCustomPropertyChange)));

 public string CustomText
 {
   get { return (string)GetValue(CustomTextProperty); }
   set { SetValue(CustomTextProperty, value); }
 }

 private static void OnCustomPropertyChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
 {
   // This is Demo Application.
   // Code to be done Later...
 }
}

我的视图模型:

public class ViewModel : INotifyPropertyChanged
{
 private string textForTextBox;

 public string TextForCustomTextBox
 {
   get
   {
     return this.textForTextBox;
   }
   set
   {
     this.textForTextBox = value;

     this.OnPropertyChange("TextForCustomTextBox");
   }
 }

 public event PropertyChangedEventHandler PropertyChanged;

 public void OnPropertyChange(string name)
 {
   PropertyChangedEventHandler handler = PropertyChanged;

   if (handler != null)
   {
     handler(this, new PropertyChangedEventArgs(name));
   }
 }
}

带有绑定的我的Xaml代码:

<custom:CustomTextBox x:Name="CustomTextBox" 
                                  CustomText="{Binding TextForCustomTextBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                  Grid.Row="1" HorizontalAlignment="Center" Width="200" Height="50" />

我的代码背后设置DataContext:

// My View Constructor
public View1()
{
  InitializeComponent();

  this.DataContext = new ViewModel();
}

2 个答案:

答案 0 :(得分:1)

您说您声明了CustomText DependencyProperty并且数据将其绑定到您的视图模型TextForCustomTextBox属性,这是正确的。但是,当你说你试图从视图中设置你的属性时,你错了。

实际所做的是从视图中设置CustomTextBox .Text属性,并且该属性未与您的CustomTextBox.CustomText属性相关联。你可以像这样连接它们,虽然我不太清楚它的重点是什么:

<Views:CustomTextBox x:Name="CustomTextBox" Text="{Binding CustomText, RelativeSource={
    RelativeSource Self}, UpdateSourceTrigger=PropertyChanged}" CustomText="{Binding 
    TextForCustomTextBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Grid.Row="1" HorizontalAlignment="Center" Width="200" Height="50" />

答案 1 :(得分:0)

尝试在实际初始化之前设置DataContext,以便在创建表单/控件对象时可用。如果之前找不到,那可能是导致绑定失败的原因。