绑定工作不正常么?
我试了一下,如果在XAML中设置了myControl的MinValue,那么第一次启动后是没执行Set,
但如果在后台代码里修改MinValue的值,是会执行的,绑定也能正常工作。楼主是遇到啥问题了?

解决方案 »

  1.   


    修改TextBox的值,没有通知到后台Set方法
      

  2.   

    myControl 是个用户控件么?
      

  3.   

    <<Pro WPF in C# 2010>>中在“依赖项属性”一章中说道:
    当创建属性包装器是,应当只包含对SetValue()方法和GetValue()方法的调用,...。不应当添加额外的验证属性值的代码、引发事件的代码,等等。这是因为WPF中的其他功能可能会忽略属性包装器,并直接调用SetValue()方法和GetValue()方法(一个例子是,在运行时解析编译过的XAML文件)。不确定是不是此问题的原因
      

  4.   

    默认是TEXTBOX失去焦点才触发,试试在绑定中设置触发条件为内容change
      

  5.   

     public static readonly DependencyProperty MinValueProperty 只读
      

  6.   

    这个与TextBox的事件没关系,绑定的时候都设置PropertyChanged了
      

  7.   

    不好意思,没注意看,出丑了,myControl是一个自定义的进度条之类的吧?
    如果是,猜测:Path=MinValue绑定的是最小值,应该一直是0,根本没有变化,所以set索引器中不会有变化
      

  8.   

    自定义依赖属性的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的文件,那里面有记录
      

  9.   


    这个回调方法我知道,确实会执行,但是这是个静态的方法,在里边没法获取xaml里边的TextBox;
      

  10.   

    TextBox也是用户控件的一部分吗?
      

  11.   

    用户控件为什么要调用xaml里的控件?用户控件本来就是要独立于调用方的xaml而单独存在的,否则不就失去作为用户控件的意义了么
      

  12.   

    那你就在用户控件里再定义一个DP,类型为TextBoxpublic 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 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}"/>
      

  13.   

    未曾看到你有设置DataContext属性,你的Path是不会工作的。
      

  14.   


    在同一个UseControl中,后台自定义的依赖属性,所以前台就不用设置DataCntext,当这个依赖属性改变的时候,TextBox的值变化了,当手动修改TextBox的时候,调试状态下依赖属性的Set方法没有执行,但是值也改变了;我想知道怎么执行Set?
      

  15.   

    你既然使用了依赖属性,那么在绑定的时候,就不会绑定那个普通的属性。
    依赖属性: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方法。