2016-09-10 8 views
0

Я создаю приложение WPF с mahapps, prism [модульность]. У меня есть код ниже HomeWindow.xaml.Элементы управления завязкой с махапами и призмой - WPF

<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 способа databinding или что-то еще здесь отсутствует? Надеюсь найти помощь по этому поводу.

ответ

1

Ваша проблема не связана с MahApps или Prism, а с тем, как работает WPF вообще. В вашем случае Name и Content частные поля и должна быть общественных свойствами

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

частное или поле не является действительным источником связывания. Вы можете найти больше относительно того, что является действительным источником связывания при Binding Sources Overview, но в вашем случае, насколько объект CLR идет:

Вы можете связываться с общественными свойствами, подсвойств, а также индексаторами, из любой объект CLR (Common Language runtime). Механизм привязки использует CLR-отражение для получения значений свойств. Альтернативно, объекты, которые реализуют ICustomTypeDescriptor или имеют зарегистрированный TypeDescriptionProvider, также работают с механизмом привязки.

Другая проблема заключается в том, что DataContext установлен неправильно. На данный момент установлен на HomeWindow, и я думаю, что он должен быть установлен экземпляр HomeViewModel который содержит TabCollection свойство

DataContext = _model; 
+0

Хороший улов приятель .. Но все-таки не повезло .. я сделал это 'public', как вы сказали .. . –

+0

Вы также сделали это свойством, добавив '{get; задавать; } '? – dkozl

+0

Да, я сделал .. Я сомневаюсь, что «призма» создает какую-то проблему здесь .. не уверен, хотя .. –