2010-07-05 3 views
6

У меня есть пользовательский элемент управления в WPF, который я хочу, чтобы текст одного из его меток считывался из XAML, где он используется. Следовательно ..Настройка значения свойства XAML для пользовательского управления

Мой контроль Пользователь:

<UserControl x:Class="muc"> 
     <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">   
      <Label.Content> 
       <Binding ElementName="TestName" Path="." /> 
      </Label.Content> 
     </Label> 
</UserControl> 

Затем, используя его:

<mycontorls:muc TestName="This is a test" /> 

Но это не работает ... Как я могу читать свойства?

+1

Все, что вам нужно - это свойство зависимостей с именем TestName, которое должно быть создано в коде кода UserControl, как показано AlvinfromDiaspar. Затем вы можете привязать контент Label к свойству TestName UserControl, используя ElementName (Quartermeister ) или привязку RelativeSource (ответ Павла Минаева). – Amsakanna

ответ

3

Я только сделал это с Silverlight, но я не удивился бы, если он будет работать точно так же!

// <summary> 
// Xaml exposed TextExposedInXaml property. 
// </summary> 
public static readonly DependencyProperty TestNameProperty = DependencyProperty.Register("TestName", typeof(string), typeof(NameOfMyUserControl), new PropertyMetadata(string.empty)); 

// <summary> 
// Gets or sets the control's text 
// </summary> 
public string TextExposedInXaml 
{ 
      get 
      { 
       return (string)GetValue(TestNameProperty); 
      } 

      set 
      { 
       SetValue(TestNameProperty , value); 

       // set the value of the control's text here...! 
      } 
} 
4

Если вы даете корень UserControl элемент имя, то вы можете обратиться к нему с помощью ElementName:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold"> 
     <Label.Content> 
      <Binding ElementName="rootElement" Path="TestName" /> 
     </Label.Content> 
    </Label> 
</UserControl> 

Вы можете также использовать синтаксис расширения разметки, чтобы сделать его немного короче:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold" 
      Content="{Binding TestName, ElementName=rootElement}"/> 
</UserControl> 

Также помните, что ваш элемент управления будет создан до того, как будут установлены его свойства. Вам нужно либо реализовать INotifyPropertyChanged, либо присвоить TestName свойство зависимостей, чтобы привязка была переоценена после того, как свойство установлено.

0

{Binding ElementName=x} связывается с элементом с именем x в дереве элементов, нет ничего, что имеет дело с собственностью TestName. Если вы хотите иметь свойство в своем пользовательском элементе управления, тогда вам нужно определить свойство в классе, соответствующем этому пользовательскому элементу управления (в вашем случае это будет muc) и использовать {Binding RelativeSource={RelativeSource FindAncestor, ...}} для ссылки на свой пользовательский элемент управления (см. here для получения более подробной информации), или дайте ему имя, чтобы вы могли использовать ElementName.

8

Я попробовал первые два ответа, и что я погорячился в коде, но не на XAML (также не позволяет увидеть изменения в режиме конструктора при использовании элемента управления).

Чтобы получить свойство работает, как и любой другой родной, здесь весь процесс: (Образец добавляет свойство зависимостей типа Nullable, чтобы показать в элементе управления в виде текста или по умолчанию, если нуль)

  1. В файле кода:

    1.а Define свойство зависимостей:

    public static readonly DependencyProperty MyNumberProperty = DependencyProperty.Register("MyNumber", typeof(Nullable<int>), typeof(MyUserControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMyNumberChanged))); 
    

    1б Реализовать OnMyNumberChanged Callback:

    private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){ 
        // When the color changes, set the icon color PlayButton 
        MyUserControl muc = (MyUserControl)obj; 
        Nullable<int> value = (Nullable<int>)args.NewValue; 
        if (value != null) 
        { 
         muc.MyNumberTextBlock.Text = value.ToString(); 
        } 
        else 
        { 
         muc.MyNumberTextBlock.Text = "N/A"; 
        } 
    } 
    

    1.с реализовать свойство MyNumber (не зависимость), чтобы использовать свойство зависимостей для простого в использовании кода:

    public Nullable<int> MyNumber{ 
        get 
        { 
         return (Nullable<int>)GetValue(MyNumberProperty); 
        } 
        set 
        { 
         SetValue(MyNumberProperty, value); 
         OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value)); // Old value irrelevant. 
        } 
    } 
    
  2. В файле XAML связать текст элемента управления TextBlock на имущество (не зависимость), чтобы получить значение по умолчанию свойство зависимостей в случае, если оно не установлено пользователем контроля (при условии, вы назвали ваш корневой элемент пользовательского элемента управления «RootElement»):

Этот код:

< TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/> 
Смежные вопросы