2013-06-23 4 views
0

Элементы моего проекта ViewModel не найдены. Я пытаюсь реализовать ViewModel в моем WPF Usercontrol. Однако привязка не работает должным образом и, как представляется, данных нет. Я пытаюсь создать ViewModel для взаимодействия, вставки общих массивов строк и различных других битов данных.ViewModel данные не найдены

MainWindow.xaml - (UserControl декларация)

<panels:FilterLister Grid.Column="0" x:Name="filter1FilterLister" /> 

MainWindows.cs - (В конструкторе, звоните в UserControl

filter1FilterLister.Initialise(typeof(Genre)); 

FilterListViewModel.cs

public class FilterListViewModel 
{ 
    MyEntities context = new MyEntities(); 
    ObservableCollection<string> entries = new ObservableCollection<string>(); 

    public Type SelectedType; 
    private string p_TypeName; 
    public string TypeName 
    { 
     get { return p_TypeName; } 
     set { 
      //p_TypeName = value; 
      p_TypeName = SelectedType.Name.ToString(); 
     } 
    } 

    public FilterListViewModel() { } 

    public FilterListViewModel(Type selectedType) 
    { 
     if (selectedType == typeof(Artist)) 
     { 
      returnedArray = Artist.ReturnArtistNames(context); 
     } 

     // put together ObservableCollection 
     foreach (var str in returnedArray) 
     { 
      entries.Add(str); 
     } 

     SelectedType = selectedType; 
    } 
} 

FilterLister. xaml

<Label Name="labelToBind" Content="{Binding TypeName}" Grid.Row="0" /> 

FilterLister.cs

public partial class FilterLister : UserControl 
{ 
    FilterListViewModel filterListViewModel; 
    private MyEntities context; 

    public FilterLister() 
    { 
     InitializeComponent(); 
     context = new MyEntities(); 
    } 

    public void Initialise(Type objectType) 
    { 
     filterListViewModel = new FilterListViewModel(objectType); 
     this.DataContext = filterListViewModel; 
    } 
} 

ответ

1

на основе кода, TypeName равно нулю, так что вы ничего не видели на этикетке. От вашего кода, я думаю, что вы хотите, чтобы описать, как:

public string TypeName 
{ 
    get{ return SelectedType.Name.ToString();} 
} 

Как предложил Дерик, вы должны добавить INotifyPropertyChanged интерфейс для уведомления, но это не должно влиять на связывание в первый раз. Если вы считаете, что данные ViewModel верны, но не заполнены в пользовательском интерфейсе, вы должны проверить DataContext и Binding.

1

Вы пропустили реализовать интерфейс INotifyPropertyChanged в вашем ViewModel, это необходимо для связанного приложения собственности может отправить «сообщение» обновления в пользовательском интерфейсе.

Вот интерфейс, и как можно реализовать это: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

public class FilterListViewModel : INotifyPropertyChanged 
{ 
MyEntities context = new MyEntities(); 
ObservableCollection<string> entries = new ObservableCollection<string>(); 

public Type SelectedType; 
private string p_TypeName; 
public string TypeName 
{ 
    get { return p_TypeName; } 
    set { 
     //p_TypeName = value; 
     p_TypeName = SelectedType.Name.ToString(); 
    NotifyPropertyChanged(); 

    } 
} 

public FilterListViewModel() { } 

public FilterListViewModel(Type selectedType) 
{ 
    if (selectedType == typeof(Artist)) 
    { 
     returnedArray = Artist.ReturnArtistNames(context); 
    } 

    // put together ObservableCollection 
    foreach (var str in returnedArray) 
    { 
     entries.Add(str); 
    } 

    SelectedType = selectedType; 
} 

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
}