silverlight绑定到自定义控件中的依赖项属性

时间:2010-08-03 11:27:11

标签: c# silverlight data-binding binding dependency-properties

我已经创建了一个在我的视图中实例化的自定义控件,在我的自定义控件(文本框)中我有一个依赖属性设置,它绑定到文本值,这一切都正常并更新。但是我现在想要将我的视图的依赖属性绑定到我的控件的依赖属性,但我不能让它工作得很好。这是我的意思

控制所选位

    <TextBox x:Name="txtBox" 
                     GotFocus="txtBox_GotFocus" 
                     LostFocus="txtBox_LostFocus" 
                     Grid.Row="0" 
                     Text="{Binding TextValueProperty, Mode=TwoWay}"/>

 public DependencyProperty TextValueProperty{ get; set; }

 public int TextValue
        {
            get { return (int)GetValue(TextValueProperty); }
            set
            {
                if ((value >= MinValue) && (value <= MaxValue))
                {
                    SetValue(TextValueProperty, value);
                }
            }
        }
    public CustomControl()
    {
         TextValueProperty = DependencyProperty.Register("TextValueProperty ", typeof(int), typeof(CustomControl), new PropertyMetadata(null ));
    }

查看所选位

<my:CustomControl x:Name="TxtBoxInt"  Grid.RowSpan="2" Grid.Row="0"  Grid.Column="1"/>

我想这样做:

<my:CustomControlx:Name="TxtBoxInt" TextValueProperty="{Binding DestinationProperty}" Grid.RowSpan="2" Grid.Row="0"  Grid.Column="1"/>

和视图中的代码

 public DependencyProperty DestionationProperty;


        public int Destination
        {
            get
            {
                return (int)GetValue(DestionationProperty);
            }
            set
            {
                SetValue(DestionationProperty, value);
            }
        }

        public CustomControl()
        {
            DestionationProperty = DependencyProperty.Register("DestionationProperty", typeof(int), typeof(CustomControl), null);            
            InitializeComponent();
        }

那么我需要做些什么才能在我的视图中绑定我的int值Destination,使其与我的自定义控件中的TextValue具有相同的值?谢谢:))

ps hi ash

1 个答案:

答案 0 :(得分:1)

正确的哦,我现在已经对这个问题进行了整理,为了别人的利益,我会试着记下如果没有我的代码在我面前,我能做到最好。

好的,首先我的自定义控件,我没有正确使用依赖属性(哈哈)开始。所以先让我们纠正。

 public partial class CustomControl : UserControl
    {
        public DependencyProperty FieldValueProperty { get; set; }

        public CustomControlViewModel Context = new CustomControlViewModel();

        public int FieldValue
        {
            get { return (int) GetValue(FieldValueProperty); }
            set
            {
                SetValue(FieldValueProperty,value);
            }
        }

        public CustomControl()
        {
            this.DataContext = Context;
            FieldValueProperty = DependencyProperty.Register("FieldValue", typeof (int), typeof (CustomControl),
                                                             new PropertyMetadata(FieldValueChanged));
            InitializeComponent();

        }

        void FieldValueChanged(Object sender, DependencyPropertyChangedEventArgs e)
        {
            Context.FieldValue = (int)e.NewValue;
        }
    }

    public class CustomControlViewModel : BaseClass
    {
        private int _fieldValue;

        public int FieldValue
        {
            get { return _fieldValue; }
            set
        { 
            _fieldValue = value;
            RaisePropertyChanged("FieldValue");
        }
        }
    }

那里有很多变化,最好的方法就是看一下使用GetValue和SetValue的CustomControl的公共FieldValue就像你的依赖属性的方法一样,当你使用SetValue它使用依赖属性时,当值更改时,依赖项属性调用FieldValueChanged方法,您指定它在DependencyProperty.Register元数据中调用它。此方法处理要更改的FieldValue,然后在CustomControlViewModel中设置FieldValue,此public int的集合设置我们访问的私有值以返回fieldvalue,但是您还注意到也调用了RaisePropertyChanged(“FieldValue”)方法。现在这个方法继承自实现此方法的BaseClass,它基本上实现了INotifyPropertyChanged的东西。所以现在当我的值基本上改变时,事件被推送,现在我需要做的就是在我的视图中处理包含此Control的事件。该位是Constuctor中的一个简单位

CustomControlInstance.Context.PropertyChanged += FieldValueChanged(Object Sender, PropertyChangedEventArgs e);

然后一个简单的方法

void FieldValueChanged(Object Sender, PropertyChangedEventsArgs e)
{
    this.FieldValue = (int)e.NewValue;
}

然后使用来自控件的FieldValue更新我的FieldValue视图,那里有一些漏洞,但它是我能记住/解释给你的最好的,希望这有助于人们,我当然理解依赖属性好多了现在:)

当我明天回到电脑上时,我会接受这个答案作为接受的答案