2011-07-11 70 views
0

我搜索了檔案尋求幫助,但我找不到任何足夠具體的問題,我的特定問題。TreeViewItem使用用戶控件和綁定

我有一個使用MVVM綁定數據的TreeView,看起來都不錯。我想擴展這樣的功能,我認爲使用TreeView項目的用戶控件會很好。

這裏是由TreeViewItems使用的分層數據模板的XAML代碼:

 <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的新手,所以我還沒有完成。

謝謝!

回答

0

在代碼隱藏

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

威爾,你是一個明星!自從上週以來我一直在關注這一點,並沒有取得什麼進展。非常感謝。現在我只想了解*爲什麼*它的工作原理!我想這是ElementName = root,所以我現在通過我的WPF書籍來看看。 –

+0

@ChrisTrollen:DP是在課堂上定義的。這個類的公共屬性位於xaml的UserControl定義的根目錄中。因此,您可以通過某種方式引用UserControl的根節點來訪問綁定中的這些公共屬性。你可以通過給它一個名字'x:Name =「something」'或者通過使用相對源'{Binding Text,RelativeSource = {RelativeSource FindAncestor,AncestorType = UserControl}}'來實現。 – Will

+0

啊,對 - 謝謝。我曾嘗試使用RelativeSource,但我不認爲將AncestorType設置爲用戶控件本身。 –

0

InternalText似乎是不依賴屬性。嘗試將其轉換爲一個。