Почему WPF не может связываться со свойствами UserControl? - PullRequest
4 голосов
/ 15 июля 2009
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); }
    }
}

Теперь я связываю это с элементом управления вкладкой, используя следующий код

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;
    }
}

XAML для элемента управления вкладками выглядит следующим образом

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

Это прекрасно работает, и вкладки «Один», «Два» появляются на вкладке управления. Однако, если я изменю базовый тип Meh с DependencyObject на UserControl, вкладки будут пустыми. Почему это?

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

EDIT

Я проверил ваш код, и кажется, что во время выполнения ContentPresenter объекта TabItem не наследует DataContext от TabControl, поскольку элемент для отображения имеет тип Visual или является его производным.

Это пахнет забавным поведением TabControl, так как замена TabControl на ListBox работает нормально. Что касается конкретной причины проблемы, для меня она не очевидна.

1 голос
/ 13 апреля 2011

Проблема в том, как работает ItemsControls. Для ListBox его элементы «обернуты» с помощью ListBoxItem (при условии, что элемент не является ListBoxItem). Поэтому, если вы добавите UserControl как элемент в ListBox, он в конечном итоге окажется в свойстве ListBoxItem.Content и будет представлен.

В TabControl его элементы оборачиваются элементом TabItem. В отличие от ListBoxItem, TabItem является производным от HeaderedContentControl. Итак, еще раз, если вы добавите UserControl как элемент в TabControl, он в конечном итоге окажется в свойстве TabItem.Content и будет представлен.

Теперь, если добавляемый элемент не является визуальным (например, DependencyObject), тогда элемент также будет присвоен свойству TabItem.Header. Так что в вашем случае, переключая базовый класс с DependencyObject на UserControl, вы переключаете это поведение.

Причина, по которой визуал не установлен как TabItem.Content, так и TabItem.Header, заключается в том, что тогда он может оказаться в дереве визуалов в двух местах, что плохо.

EDIT:

Кроме того, ItemTemplate передается в TabItem.HeaderTemplate, а не TabItem.ContentTemplate (как в случае ListBoxItem).

1 голос
/ 13 апреля 2011

Я тоже столкнулся с этой проблемой и только что нашел:

Связывание для элементов управления TabItem

Похоже, вместо использования свойств ItemTemplate и ContentTemplate, вы можете просто создать ItemContainerStyle. Я не знаю, почему это работает, но у меня это сработало.

Очевидно, это немного поздно для Питера, но, возможно, это поможет следующему человеку, спотыкающемуся в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...