2009-07-15 12 views
4
public class Meh : DependencyObject 
{ 
    public static readonly DependencyProperty MyPropertyProperty = 
     DependencyProperty.Register("MyProperty", typeof(string), typeof(Meh)); 

    public string MyProperty 
    { 
     get { return (string)GetValue(MyPropertyProperty); } 
     set { SetValue(MyPropertyProperty, value); } 
    } 
} 

ich Databind, dass die Kontrolle auf eine Registerkarte mit dem folgenden CodeWarum kann WPF nicht an UserControl-Eigenschaften binden? Jetzt

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     var data = new List<Meh>(); 
     data.Add(new Meh { MyProperty = "One" }); 
     data.Add(new Meh { MyProperty = "Two" }); 
     TabControlViews.ItemsSource = data; 
    } 
} 

Die XAML für das Register-Steuerelement wie folgt aussehen

<TabControl Name="TabControlViews"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding MyProperty}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
</TabControl> 

Dies funktioniert gut und die Registerkarten „One“, "Zwei" erscheinen auf dem Tab-Steuerelement. Wenn ich jedoch den Basistyp von Meh von DependencyObject zu UserControl ändere, sind die Registerkarten leer. Warum ist das?

Antwort

1

ich in dieses Problem lief so gut, und ich habe gerade dies:

Binding for TabItem's content controls

Es ist wie eher sieht die ItemTemplate und Content Eigenschaften als verwenden, können Sie nur eine ItemContainerStyle erstellen. Ich weiß nicht, warum es funktioniert, aber es hat für mich funktioniert.

Offensichtlich ist dies ein wenig zu spät für Peter, aber vielleicht wird es der nächsten Person helfen, darüber zu stolpern.

2

EDIT

Ich habe Ihren Code überprüft, und es scheint, dass, sobald das Element zur Laufzeit, wird der Content des TabItem nicht die Datacontext aus dem TabControl erbt vom Typ von ihm Visuellen Effekten oder abgeleitet anzuzeigen .

Das riecht nach einem lustigen Verhalten von TabControl, da das Ersetzen von TabControl durch ListBox gut funktioniert. Was die spezifische Ursache des Problems angeht, ist es für mich nicht ersichtlich.

1

Das Problem ist, wie ItemsControls funktioniert. Für ListBox werden Items mit einem ListBoxItem "umhüllt" (vorausgesetzt, das Item ist kein ListBoxItem). Wenn Sie also ein UserControl als Element zu einer ListBox hinzufügen, wird es letztendlich in der ListBoxItem.Content-Eigenschaft enden und dargestellt.

Mit TabControl werden seine Elemente mit einem TabItem umschlossen. Im Gegensatz zu ListBoxItem wird TabItem von HeaderedContentControl abgeleitet. Wenn Sie also ein UserControl als Element zu einem TabControl hinzufügen, wird es letztendlich in der TabItem.Content-Eigenschaft und dem Present enden.

Wenn das hinzuzufügende Element kein visuelles Objekt ist (z. B. ein DependencyObject), wird das Element auch der Eigenschaft TabItem.Header zugewiesen. Wenn Sie in Ihrem Fall die Basisklasse von DependencyObject in UserControl umschalten, schalten Sie dieses Verhalten um.

Der Grund dafür, dass ein visual nicht auf TabItem.Content und TabItem.Header gesetzt ist, liegt daran, dass es in zwei Fällen an der visuellen Struktur landen könnte, was schlecht ist.

EDIT:

Auch ist die ItemTemplate zum TabItem.HeaderTemplate weitergegeben, nicht TabItem.ContentTemplate (was der Fall für ListBoxItem ist).

Verwandte Themen