привязка silverlight к свойству зависимости в пользовательском элементе управления - PullRequest
3 голосов
/ 03 августа 2010

У меня есть пользовательский элемент управления, созданный в моем представлении, в моем пользовательском элементе управления (текстовое поле) у меня установлено свойство зависимости, привязанное к текстовому значению, все это работает правильно и обновляется. Однако теперь я хочу связать свойство зависимостей моего представления со свойством зависимостей моего элемента управления, но я не могу заставить это работать. Вот что я имею в виду

Контроль выбранных битов

    <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 из моего пользовательского элемента управления? Спасибо:)

пс привет пепел

1 Ответ

1 голос
/ 05 августа 2010

Правильно, на самом деле я уже разобрался с этой проблемой, и для блага других я постараюсь записать, как я сделал все возможное, без моего кода передо мной.

Хорошо, сначалаИз всех моих пользовательских элементов управления я не правильно использовал свойства зависимости (ха-ха).Итак, давайте сначала исправим это.

 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");
        }
        }
    }

Довольно много изменений, лучший способ подумать об этом - взглянуть на публичную часть FieldValue, которая является частью CustomControl, которая использует GetValue и SetValue так же просто, как методы для вашего свойства зависимости, когда вы используете SetValueон использует свойство зависимостей, когда значение изменяет свойство зависимостей, вызывает метод FieldValueChanged, который вы указали для вызова в метаданных DependencyProperty.Register.Этот метод, который обрабатывает изменяемое FieldValue, затем устанавливает FieldValue в CustomControlViewModel; набор для этого public 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 из элемента управления, то естьв ней есть некоторые дыры, но это лучшее, что я могу вспомнить / объяснить вам, надеюсь, это поможет людям, я, конечно, теперь гораздо лучше понимаю свойства зависимости:)

Я приму этот ответ как принятый ответ, когдаЗавтра я снова за компьютером

...