gpt4 book ai didi

wpf - 如何解决内容演示者不显示 View ?

转载 作者:行者123 更新时间:2023-12-03 10:14:52 24 4
gpt4 key购买 nike

我在 TabControl 的数据模板中添加了一个内容展示器,以便显示正确的 View 。

但是当我加载应用程序时,选项卡会显示,但它们没有用户控制内容。

我用谷歌搜索了这个错误,发现了这个 solution ,这表明数据上下文存在错误,但在下面的我的 AppVM 和 AppView 中设置似乎没问题。

我在 AppView 中引用的 VM 和 View 的名称也是正确的。

有谁知道这里的设置哪里出错了?

这是包含两个 View 的 ApplicationView:

<Window x:Class="MongoDBApp.Views.ApplicationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:MongoDBApp.Views"
xmlns:vm="clr-namespace:MongoDBApp.ViewModels"
Title="ApplicationView"
Width="800"
Height="500">

<Window.Resources>
<DataTemplate DataType="{x:Type vm:CustomerDetailsViewModel}">
<views:CustomerDetailsView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:CustomerOrdersViewModel}">
<views:CustomerOrdersView />
</DataTemplate>
</Window.Resources>

<Window.DataContext>
<vm:ApplicationViewModel />
</Window.DataContext>


<TabControl ItemsSource="{Binding PageViewModels}" TabStripPlacement="Top">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding CurrentPageViewModel}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Window>

ApplicationViewModel 构造函数及相关字段:
private ICommand _changePageCommand;
private IPageViewModel _currentPageViewModel;
private List<IPageViewModel> _pageViewModels;
private static ICustomerDataService customerDataService = new CustomerDataService(CustomerRepository.Instance);




#endregion

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationViewModel"/> class.
/// </summary>
public ApplicationViewModel()
{
// Add available pages
PageViewModels.Add(new CustomerDetailsViewModel(customerDataService));
PageViewModels.Add(new CustomerOrdersViewModel());

// Set starting page
CurrentPageViewModel = PageViewModels[0];
}

最佳答案

ContentTemplate属性包装 Content目的。

例如,使用您的代码设置 .Content属性到 CustomerDetailsViewModel对象,并试图绑定(bind)到 CurrentPageViewModel那个不存在的对象。

正在渲染的是:

<TabControl>
<TabItem>
<ContentPresenter Content=CustomerDetailsViewModel>
<ContentPresenter Content="{Binding CurrentPageViewModel}" />
</ContentPresenter>
</TabItem>
<TabItem>
<ContentPresenter Content=CustomerOrdersViewModel>
<ContentPresenter Content="{Binding CurrentPageViewModel}" />
</ContentPresenter>
</TabItem>
</TabControl>

因为 TabControl 会自动生成 ContentPresenter包装 .Content对于每个 TabItem ,你根本不需要这个模板。

但听起来你真正想要的是绑定(bind) SelectedItem TabControl 的属性
<TabControl ItemsSource="{Binding PageViewModels}" 
SelectedItem="{Binding CurrentPageViewModel}"
TabStripPlacement="Top">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>

关于wpf - 如何解决内容演示者不显示 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34022322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com