绑定选项卡控件与mahapps和棱镜 - WPF

时间:2016-09-10 17:31:04

标签: c# wpf xaml prism mahapps.metro

我正在使用mahappsprism [模块化]构建WPF应用程序。我的代码低于HomeWindow.xaml

<Controls:MetroWindow x:Class="Project.Views.HomeWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
        xmlns:local="clr-namespace:Project.Views"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True" 
        <!--The above code is for automatically binding of viewmodel into view-->
        Height="700" Width="1200" Background="White">
    <Grid>
        <TabControl ItemsSource="{Binding TabCollection}">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock>                            
                        <TextBlock Text="{Binding Name}"/>
                    </TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Label Content="{Binding Content}" />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Controls:MetroWindow>

我在HomeViewModel.cs目录下的ViewModels中有以下结构。

public class HomeViewModel : BindableBase
{
    private ObservableCollection<Item> _tabCollection;
    public ObservableCollection<Item> TabCollection { get { return _tabCollection; } set { SetProperty(ref _tabCollection, value); } }
    //Prism way of getting and setting data
}

public class Item
{
    private string Name;
    private string Content;

    public Item(string name, string content)
    {
        Name = name;
        Content = content;
    }
}

下面是我如何通过TabCollection将数据添加到HomeWindow.xaml.cs属性中。

private HomeViewModel _model=new HomeViewModel();
public HomeWindow(EmployeeViewModel model)
{
    InitializeComponent();
    _model.UserViewModel = model;
    LoadHomeData(_model.UserViewModel.EmpRole);
    DataContext = this;
}

private void LoadHomeData(string Role)
{
    if (string.Equals(Role, "Admin"))
    {
        _model.TabCollection= new ObservableCollection<Item>()
        {
            new Item("Test1", "1"),
            new Item("Test2", "2"),
            new Item("Test3", "3")
        };
    }
}

现在重要的是,标签不会显示。它是一个空白的空窗口。我已经按照 issue here 中的示例进行了操作,并且已经通过几个类似的帖子进行了同样的方法。但他们都没有帮助。这是因为prism的{​​{1}}方式还是还缺少其他任何内容?希望能找到一些帮助......

1 个答案:

答案 0 :(得分:1)

您的问题与MahApps或Prism无关,而是与WPF的工作方式有关。在您的情况下,NameContent是私有字段,应该是公共属性

public string Name { get; set; }
public string Content { get; set; }

private或field不是有效的绑定源。您可以在Binding Sources Overview下找到更多关于什么是有效绑定源的信息,但在您的情况下,就CLR对象而言:

  

您可以绑定到任何公共语言运行时(CLR)对象的公共属性,子属性以及索引器。绑定引擎使用CLR反射来获取属性的值。或者,实现ICustomTypeDescriptor或具有已注册的TypeDescriptionProvider的对象也可以使用绑定引擎。

另一个问题是DataContext设置错误。目前设置为HomeWindow,我认为它应设置为HomeViewModel的实例,其中包含TabCollection属性

DataContext = _model;