C # / WPF Привязка в TabControl ItemsSource к свойству в коде позади элемента списка - PullRequest
0 голосов
/ 24 октября 2019

В моей ViewModel у меня есть BindingList, который содержит мои виды, которые должны отображаться в виде вкладок в моем TabControl. Текст для вкладки определяется в коде позади представления. Я также определил простой тестовый класс для проверки привязки, который отлично работает. Не работает только привязка к свойству code позади.

Xaml-код для моего TabControl:

<TabControl ItemsSource="{Binding TabControlContentList}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=DisplayName, FallbackValue=FallbackValue}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

BindingList, к которому он привязан:

void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

public BindingList<object> TabControlContentList
{
    get => tabControlContentList;
    set
    {
        tabControlContentList = value;
        RaisePropertyChanged();
    }
}
private BindingList<object> tabControlContentList = new BindingList<object>();

Класс теста:

class ControlTest
{
    public string DisplayName { get; private set; } = "";

    public ControlTest(string name) => DisplayName = name;
}

Код Xaml позади AnalysisView.xaml.cs:

public partial class AnalysisView
{
    public string DisplayName { get; private set; } = "Analysis";

    public AnalysisView()
    {
        InitializeComponent();
    }
} 

В моей ViewModel у меня есть следующий код:

public AnalysisView analysisView = new AnalysisView();
TabControlContentList.Clear();
TabControlContentList.Add(new ControlTest("Menu 1"));
TabControlContentList.Add(new ControlTest("Menu 2"));
TabControlContentList.Add(analysisView);
TabControlContentList.Add(new ControlTest("Menu 3"));
TabControlContentList.Add(new ControlTest("Menu 4"));

My TabControl затем показывает пять вкладок. Первые два имеют текст «Меню 1» и «Меню 2», третий - «FallbackValue», затем «Меню 3» и «Меню 4».

Я больше не знаю, почемупривязка к свойству в коде в AnalysisView.xaml.cs не работает. Это может быть обычная вещь Wpf?

1 Ответ

0 голосов
/ 24 октября 2019

Прежде чем представить свой ответ, я настоятельно рекомендую вам загрузить и узнать, как использовать Snoop для WPF или использовать встроенные в Visual Studio инструменты проверки времени выполнения XAML. Они позволяют вам просматривать привязки, контекст данных и т. Д.

Основная причина, по которой ваш код не работает, заключается в том, что UserControl не имеет DataContext по умолчанию.

Таким образом, обновление вашего AnalysisView примерно так даст DataContext указание на себя:

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

Однако DataContext в UserControl не попадет в ваш DataTemplateкак ваши другие объекты. Чтобы это работало, вам нужно изменить привязку следующим образом:

<DataTemplate>
    <TextBlock Text="{Binding Path=DataContext.DisplayName, FallbackValue=ERROR!, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" />
</DataTemplate>

Работа с UserControl s выглядит как хак. Поэтому вам может потребоваться найти способы для разработки любого приложения, которое вы создаете, немного по-другому.

Кроме того, код в вашем примере не использует INotifyPropertyChanged для свойств, поэтому вы не будете получать никаких уведомлений об изменениях. ,Возможно, вы захотите узнать больше о шаблоне MVVM.

...