绑定工作不正常么?
我试了一下,如果在XAML中设置了myControl的MinValue,那么第一次启动后是没执行Set,
但如果在后台代码里修改MinValue的值,是会执行的,绑定也能正常工作。楼主是遇到啥问题了?
我试了一下,如果在XAML中设置了myControl的MinValue,那么第一次启动后是没执行Set,
但如果在后台代码里修改MinValue的值,是会执行的,绑定也能正常工作。楼主是遇到啥问题了?
修改TextBox的值,没有通知到后台Set方法
当创建属性包装器是,应当只包含对SetValue()方法和GetValue()方法的调用,...。不应当添加额外的验证属性值的代码、引发事件的代码,等等。这是因为WPF中的其他功能可能会忽略属性包装器,并直接调用SetValue()方法和GetValue()方法(一个例子是,在运行时解析编译过的XAML文件)。不确定是不是此问题的原因
如果是,猜测:Path=MinValue绑定的是最小值,应该一直是0,根本没有变化,所以set索引器中不会有变化
UserControl: public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
} public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register("MinValue", typeof(double), typeof(UserControl1), new PropertyMetadata(MinValueChanged)); public double MinValue
{
get { return (double)GetValue(MinValueProperty); }
set
{
SetValue(MinValueProperty, value);
}
} public static void MinValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
using (StreamWriter sw = new StreamWriter("log.txt", true))
{
sw.WriteLine(e.NewValue);
}
}
}
在xaml里引用用户控件的命名空间,然后调用的xaml: <uc:UserControl1 x:Name="myControl" MinValue="10.0"></uc:UserControl1>
<TextBox Height="20" Width="80" Text="{Binding ElementName=myControl,Path=MinValue,Mode=TwoWay}"/>运行后会在目录下出现log.txt的文件,那里面有记录
这个回调方法我知道,确实会执行,但是这是个静态的方法,在里边没法获取xaml里边的TextBox;
{
public UserControl1()
{
InitializeComponent();
} public static readonly DependencyProperty MinValueProperty = DependencyProperty.Register("MinValue", typeof(double), typeof(UserControl1), new PropertyMetadata(MinValueChanged)); public double MinValue
{
get { return (double)GetValue(MinValueProperty); }
set
{
SetValue(MinValueProperty, value);
}
} public TextBox MyTextBox
{
get { return (TextBox)GetValue(MyTextBoxProperty); }
set { SetValue(MyTextBoxProperty, value); }
} public static readonly DependencyProperty MyTextBoxProperty =
DependencyProperty.Register("MyTextBox", typeof(TextBox), typeof(UserControl1), new PropertyMetadata(null)); public static void MinValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
using (StreamWriter sw = new StreamWriter("log.txt", true))
{
sw.WriteLine(e.NewValue);
TextBox txt = (d as UserControl1).MyTextBox;
if (txt != null)
{
sw.WriteLine(txt.Width + "===" +txt.Height);
}
}
}
}
xaml: <uc:UserControl1 x:Name="myControl" MinValue="10.0" MyTextBox="{Binding ElementName=txt}" ></uc:UserControl1>
<TextBox x:Name="txt" Height="20" Width="80" Text="{Binding ElementName=myControl,Path=MinValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
在同一个UseControl中,后台自定义的依赖属性,所以前台就不用设置DataCntext,当这个依赖属性改变的时候,TextBox的值变化了,当手动修改TextBox的时候,调试状态下依赖属性的Set方法没有执行,但是值也改变了;我想知道怎么执行Set?
依赖属性:public static readonly DependencyProperty MinValueProperty
普通属性:public double MinValue如果你在普通属性里的Set、Get方法中写任何多余的代码,都没法在绑定中被自动触发。绑定时,系统检测到存在一个名字叫“MinValue”的依赖属性,就自动忽略普通属性了,这里的所谓名字,不是变量名“MinValueProperty”,而是 MinValueProperty在定义时给的名字DependencyProperty.Register("MinValue", typeof(double), typeof(MyControl), new PropertyMetadata(0.0));。所以,你这里只会触发这个MinValueProperty的值改变事件,而不会触发Set方法。换句话说,你的普通属性完全可以不用定义。至于为啥要定义?完全是为了后台赋值方便而已。另外还有一种定义可以绑定的类的方法,就是让你的类继承INotifyPropertyChanged接口,此时的普通属性将用于绑定,且会触发Get和Set方法。