【问题标题】:silverlight binding to a dependency property in a custom controlSilverlight 绑定到自定义控件中的依赖属性
【发布时间】:2011-03-24 16:26:17
【问题描述】:

我已经创建了一个自定义控件,它在我的视图中被实例化,在我的自定义控件(文本框)中,我设置了一个绑定到文本值的依赖属性,这一切都可以正常工作并更新。但是,我现在想将我的视图的依赖属性绑定到我的控件的依赖属性,但我无法让它完全正常工作。这就是我的意思

控制选定的位

    <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嗨灰

【问题讨论】:

  • +1 这是一个很好的问题,因为它一次性展示了许多误解和陷阱。提供完整的答案可能需要一些时间。关于要求的问题,您正在尝试创建一个仅允许输入数字并且必须限制在最小值/范围内的控件?在 SDK 或 Silverlight Toolkit 中找不到控件,例如设置 NumericUpDown 控件的样式?
  • 这是非常有限的版本,它奠定了与字段值进行简单绑定的基础。最终将需要更多功能,但我在进行其他控制时也可能会遇到同样的问题,所以最好先解决这个问题。我相信我缺少的是一些财产筹集的东西,我没有任何运气来实施

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


【解决方案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");
        }
        }
    }

那里有很多变化,考虑它的最佳方法是查看作为 CustomControl 一部分的公共 FieldValue,它使用 GetValue 和 SetValue 作为您的依赖属性的方法,当您使用 SetValue 时,它​​使用依赖属性,当值更改时,依赖属性调用 FieldValueChanged 方法,您指定它在 DependencyProperty.Register 元数据中调用该方法。此方法处理正在更改的 FieldValue,然后在 CustomControlViewModel 中设置 FieldValue,该公共 int 设置设置我们访问以返回 fieldvalue 的私有值,但正如您所注意到的,它还调用 RaisePropertyChanged("FieldValue") 方法。现在这个方法是从实现这个方法的我的 BaseClass 继承的,它基本上实现了 INotifyPropertyChanged 的​​东西。因此,现在当我的值发生变化时,基本上会推送一个事件,现在我需要做的就是在包含此控件的视图中处理该事件。这个位是构造函数中的一个简单位

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

那么简单的方法

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

然后使用控件中的 FieldValue 更新我的视图的 FieldValue,其中有一些漏洞,但它是我能记住/向您解释的最好的,希望这对人们有所帮助,我当然更好地理解依赖属性现在:)

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

【讨论】:

  • 此方法有效但不可取我将在有时间时使用依赖属性的正确方法进行更新
猜你喜欢
  • 2012-08-29
  • 2019-05-26
  • 2011-04-11
  • 2012-08-07
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多