2016-11-19 3 views
0

Я создал пользовательский элемент управления wpf с текстовым полем и поле со списком. для доступа свойства текста в текстовом поле я использовал код нижеОшибка при доступе к элементу управления в пользовательском элементе wpf

public static readonly DependencyProperty TextBoxTextP = DependencyProperty.Register(
     "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor)); 

public string TextBoxText 
{ 
    get { return txtValue.Text; } 
    set { txtValue.Text = value; } 
} 

в другом проекте я использовал контроль и связать текст, как показано ниже:

<textboxunitconvertor:TextBoxUnitConvertor Name="wDValueControl" TextBoxText="{Binding _FlClass.SWa_SC.Value , RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="161" Height="28" HorizontalAlignment="Left" VerticalAlignment="Top"/> 

я уверен, что класс, который используется для привязки, корректно работает, потому что, когда я использовал его для бинга с текстовым полем непосредственно в моем проекте, он работает правильно, но когда я привязываю его к текстовому свойству текстового поля в usercontrol, он приносит null и привязка не работает. Может ли кто-нибудь мне помочь?

ответ

0

Неправильная декларация свойства зависимостей. Он должен выглядеть как показано ниже, где геттер и сеттер в CLR свойств оболочки вызвать GetValue и SetValue методы:

public static readonly DependencyProperty TextBoxTextProperty = 
    DependencyProperty.Register(
     "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor)); 

public string TextBoxText 
{ 
    get { return (string)GetValue(TextBoxTextProperty); } 
    set { SetValue(TextBoxTextProperty, value); } 
} 

В XAML вашего UserControl, вы бы привязать к собственности, как это:

<TextBox Text="{Binding TextBoxText, 
    RelativeSource={RelativeSource AncestorType=UserControl}}" /> 

Если вам нужно, чтобы получить уведомление, когда в TextBoxText изменения свойств, можно зарегистрировать PropertyChangedCallback с PropertyMetadata передается методу Регистрация:

public static readonly DependencyProperty TextBoxTextProperty = 
    DependencyProperty.Register(
     "TextBoxText", typeof(string), typeof(TextBoxUnitConvertor), 
     new PropertyMetadata(TextBoxTextPropertyChanged)); 

private static void TextBoxTextPropertyChanged(
    DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    TextBoxUnitConvertor t = (TextBoxUnitConvertor)o; 
    t.CurrentValue = ... 
} 
+0

спасибо много. Другой вопрос. если мне нужно связать созданное свойство TextBoxText с другим свойством, как показано ниже, как я могу это сделать. частный двойной _CurrentValue; [Доступно для просмотра (false)] public double CurrentValue { Получить { { return _CurrentValue; } set {_CurrentValue = значение; } } – ali

+0

Зарегистрируйте PropertyChangedCallback, как показано в отредактированном ответе. – Clemens

+0

очень хорошо. но если вставить двустороннюю привязку, как это может быть? это означает, что если пользователь изменил текст текстового поля в пользовательском элементе управления, связанный с ним класс в главном проекте изменился бы на него? – ali

0

Вы не создаете право собственности зависимостей. Используйте этот код:

public string TextBoxText 
     { 
      get { return (string)GetValue(TextBoxTextProperty); } 
      set { SetValue(TextBoxTextProperty, value); } 
     } 

public static readonly DependencyProperty TextBoxTextProperty = 
      DependencyProperty.Register("TextBoxText", typeof(string), typeof(TextBoxUnitConvertor), new PropertyMetadata("")); 

Затем в пользовательском элементе управления BindTextBoxText к значению txtValue.Text