TreeViewItem с использованием пользовательского элемента управления и привязки - PullRequest
0 голосов
/ 11 июля 2011

Я искал в архивах справку, но не могу найти ничего достаточно конкретного для моей конкретной проблемы.

У меня есть TreeView, использующий MVVM для привязки данных, и все кажется хорошим.Я хочу расширить функциональность, так что я думаю, что было бы неплохо использовать пользовательский элемент управления для элементов TreeView.

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

        <HierarchicalDataTemplate
          DataType="{x:Type vm:SiteViewModel}" 
          ItemsSource="{Binding Children}">
          <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding SiteName}"/>
         </StackPanel>
        </HierarchicalDataTemplate>

Я хочу заменить TextBlock своим пользовательским элементом управления:

        <uc:MyTextBlock InternalText="{Binding SiteName}"/>

Пользовательский элемент управления (на данный момент) просто содержит еще один TextBlock и имеет свойство зависимости с именем InternalText, т.е.

  <TextBlock Text="{Binding Path=InternalText}" />

и я устанавливаю DataContext в конструкторе пользовательского элемента управления на себя:

public MyTextBlock ()
{
  InitializeComponent();
  DataContext = this;
}

Это не работает, , но , если я просто изменяю шаблон, чтобы он определял статический тексткажется, что он работает нормально:

        <uc:MyTextBlock InternalText="Some site name"/>

Так как же получить связанные данные для передачи в пользовательский элемент управления?Возможно, это что-то простое, но я новичок в WPF, поэтому я еще не решил.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

В коде за

public class MyUserControl : UserControl
{
    #region Text
    /// <summary>
    /// The <see cref="DependencyProperty"/> for <see cref="Text"/>.
    /// </summary>
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register(
            RunningPropertyName,
            typeof(string),
            typeof(MyUserControl ),
            new UIPropertyMetadata(null));

    /// <summary>
    /// The name of the <see cref="Text"/> <see cref="DependencyProperty"/>.
    /// </summary>
    public const string TextPropertyName = "Text";

    /// <summary>
    /// The text to display
    /// </summary>
    public string Text
    {
        get { return (string)GetValue(TextProperty ); }
        set { SetValue(TextProperty , value); }
    }
    #endregion      
}

В xaml

<UserControl x:Class="Derp.MyUserControl" 
             x:Name="root"
             SnippingXamlForBrevity="true"

и позже ...

<TextBlock Text="{Binding Text, ElementName=root}" />
0 голосов
/ 11 июля 2011

InternalText представляется не зависимым свойством. Попробуйте преобразовать его в один.

...