我创建了一个继承自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();
}
答案 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,以便在创建表单/控件对象时可用。如果之前找不到,那可能是导致绑定失败的原因。