2009-11-22 73 views
0

確定目前我有這一段代碼時結合:WPF使用的DataTemplate

<TabItem Style="{DynamicResource MyStyle" x:Name="TabCustomers" Padding="0,1,4,1" 
Header={Binding Path=customersHeader}/> 

現在我想添加一個圖標有這樣怎麼辦?(通過去除上面的標題):

<TabItem.Header> 
<StackPanel Orientation="Horizontal"> 
    <Image Stretch="UniformToFill" Source="{StaticResource customers}"/> 
    <TextBlock x:Key="textblock" Margin="4,0,0,0" 
    Text="{Binding Path=customersHeader}"/> 
</StackPanel> 
</TabItem.Header> 

到目前爲止,沒關係。 我想用數據模板來概括這一點。我認爲我必須做這在我的資源字典:

<DataTemplate x:Key="TabItemCustomersTemplate" DataType="{x:Type TabItem}"> 
<StackPanel Orientation="Horizontal"> 
    <Image Stretch="UniformToFill" Source="{StaticResource customers}"/> 
    <TextBlock x:Key="textblock" Margin="4,0,0,0" 
    Text="{Binding Path=customersHeader}"/> 
    </StackPanel> 
</DataTemplate> 

,改變這在我的TabItem聲明:

<TabItem ... HeaderTemplate="{StaticResource TabItemCustomersTemplate}".../> 

所以我碰到以下問題和問題: 1)結合不工作,爲什麼? 2)我如何從c#訪問textblock? 3)我怎麼能概括這個,所以我不必一遍又一遍地爲不同的標籤項目(或其他控件)複製這個,這樣我就可以每次傳遞我自己的文本和圖像源?例如,你可以用它來創建一個圖像按鈕,如果你有20個按鈕,代碼會變得混亂。

任何想法?

謝謝。

回答

0
  1. 如果模板在 的TabItem頭,你不需要設置模板的 數據類型。 標題是標籤 項目的屬性,它實際上是 類型對象的屬性,您可以將任何內容放在 那裏。

    嘗試刪除DataType="{x:Type TabItem}"並查看它是否有效。

  2. 您不應該需要從c#訪問 文本塊,您應該使用 做與綁定系統。在您的標題中放置一個 自定義對象。然後 將此對象綁定到您的文本塊 然後調整該對象,並且它將操縱文本塊 。如果在數據模板中包含 ,則獲取 元素總是很難。你 應該不需要。如果你發現 自己走的可視化樹 找到你正在做 東西,你可以通過以下 建議2概括這個硬盤的方式
  3. 視覺元素,使用自定義的對象, 取出X:你的關鍵數據 模板並將其DataType設置爲 是您的自定義對象的類型。 那麼無論您的自定義對象 出現,你會得到它的數據 模板正常
0

試試這個,這是爲我工作

<Window.Resources> 
    <!-- <BitmapImage x:Key="customers" UriSource="einstein.jpg"/>--> 
    <DataTemplate x:Key="TabItemCustomersTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Stretch="UniformToFill" Source="{Binding Path=Customers}"/> 
      <TextBlock Margin="4,0,0,0" x:Name="txt" Text="{Binding Path=CustomersHeader}"/> 
</StackPanel> 
    </DataTemplate> 
</Window.Resources> 
    <Grid> 
    <TabControl Name="mytabcontrol"> 
     <TabItem x:Name="TabCustomers" Padding="0,1,4,1" Header="{Binding}" HeaderTemplate="{StaticResource TabItemCustomersTemplate}"> 
      <Label Content="myContent" Background="Red"/> 
     </TabItem> 
    </TabControl> 
</Grid> 

在後面的代碼

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     var lst = new List<People>(); 
     lst.Add(new People() { CustomersHeader = "My Customer" }); 
     this.DataContext = lst; 
    } 
} 

public class People 
{ 
    public string CustomersHeader { get; set; } 
    public BitmapImage Customers { get; set; } 
} 

而且可以使用此代碼在代碼中找到您的文本塊

TabPanel tabPanel = GetVisualChild<TabPanel>(mytabcontrol); 
if (tabPanel != null) 
{ 
    foreach (UIElement element in tabPanel.Children) 
    { 
     TabItem tabItem = element as TabItem; 
     var image = FindNameFromHeaderTemplate<TextBlock>(tabItem, "txt"); 
    } 
} 

    public static T FindNameFromHeaderTemplate<T>(TabItem tabItem, String name) where T : UIElement 
    { 
     if (tabItem == null) 
     { 
      throw new ArgumentNullException("container"); 
     } 

     if (tabItem.HeaderTemplate == null) 
     { 
      return null; 
     } 

     ContentPresenter contentPresenter = GetVisualChild<ContentPresenter>(tabItem); 
     if (contentPresenter == null) 
     { 
      return null; 
     } 

     T element = tabItem.HeaderTemplate.FindName(name, contentPresenter) as T; 
     return element; 
    } 

    public static T GetVisualChild<T>(Visual referenceVisual) where T : Visual 
    { 
     Visual child = null; 
     for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceVisual); i++) 
     { 
      child = VisualTreeHelper.GetChild(referenceVisual, i) as Visual; 
      if (child != null && child.GetType() == typeof(T)) 
      { 
       break; 
      } 
      else if (child != null) 
      { 
       child = GetVisualChild<T>(child); 
       if (child != null && child.GetType() == typeof(T)) 
       { 
        break; 
       } 
      } 
     } 
     return child as T; 
    } 
+0

謝謝!如何在不聲明不同數據模板的情況下綁定不同的圖像源? – immuner 2009-11-22 15:09:03

+0

您可以在後面的代碼中擁有一個屬性,並且可以在數據模板中使用它綁定圖像的源屬性,也可以使用數據模板本身的觸發器更改某些特定項目的圖像。 – viky 2009-11-22 15:35:23

+0

你能告訴我如何做第一個?在數據模板的代碼中綁定屬性? – immuner 2009-11-22 18:15:43