2012-04-09 4 views
2

저는 WPF MVVM을 사용하고 있습니다. 나는 특성 MenuHeaderMenuItemsMenuViewModel을 가지고 XAML간단한 Wpf MVVM 바인딩 문제

<UserControl x:Class="Accounting.Menu" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Accounting" 
      mc:Ignorable="d" 
      d:DesignHeight="105" d:DesignWidth="300"> 
    <UserControl.DataContext> 
     <local:MenuViewModel/> 
    </UserControl.DataContext> 
    <StackPanel> 
     <StackPanel> 
       <TextBlock Text="{Binding Path=MenuHeader}"/> 
     </StackPanel> 
     <ListBox ItemsSource="{Binding Path=MenuItems}" Height="70"/>    
    </StackPanel>  
</UserControl> 

에 다음과 같은 코드를 작성했습니다. 런타임 중에 두 속성 모두에서 값을 가져옵니다. 이전 텍스트는 TextBlock이고 뒤에는 ListBox의 ItemSource에 바인딩됩니다. 그러나 솔루션을 실행하면 TextBlock 및 ListBox가 비어 있습니다.

편집 : 사전에 코드 뷰 모델

public class MenuViewModel: ViewModelBase 
    { 
     AccountingDataClassesDataContext db; 

     private string _menuType; 
     public string MenuHeader { get; set; } 
     public ObservableCollection<string> MenuItems { get; set; } 

     public MenuViewModel() 
     { 

     } 

     public MenuViewModel(string menuType) 
     { 
      this._menuType = menuType; 
      db = new AccountingDataClassesDataContext(); 
      if (menuType == "Vouchers") 
      { 
       var items = db.Vouchers.OrderBy(t => t.VoucherName).Select(v => v.VoucherName).ToList<string>(); 

       if (items.Any()) 
       { 
        MenuItems = new ObservableCollection<string>(items); 
        MenuHeader = "Vouchers"; 
       } 
      } 
      else 
      { 
       System.Windows.MessageBox.Show("Menu not found"); 
      } 

     } 
    } 

감사합니다.

+1

뷰 모델에'INotifyPropertyChanged'을 구현 했습니까? – ChrisF

+0

ViewModel 코드 게시 –

+1

뷰의 데이터 컨텍스트를 필수 뷰 모델로 설정 했습니까? –

답변

3

아무 것도하지 않는 ViewModel의 기본 생성자를 사용하여 XAML에서 ViewModel을 만들고 있습니다. 모든 모집단 코드는 절대로 호출되지 않는 기본이 아닌 생성자에 있습니다.

더 일반적인 방법은 코드에서 ViewModel을 만들고 명시 적으로 View.DataContext = ViewModel을 사용하여보기에 삽입하거나 DataTemplate을 암시 적으로 사용하는 것입니다.

+0

동의합니다. 기본 생성자가 필요 없지만 xaml에서 datacontext를 할당하면 컴파일러에 '기본 생성자가 없습니다'라고 표시됩니다. viewmodel을 삽입하고 기본 생성자를 제거해 보겠습니다. – Marshal

+1

예, 문제였습니다. XAML 및 기본 생성자에서 datacontext 할당을 제거했으며 매력처럼 작동합니다. 감사 – Marshal

1

OnPropertyChanged 이벤트를 트리거해야한다고 생각합니다. MVVM 라이브러리 (예 : MVVM Light를 사용하는 ViewModelBase에서 상속)를 사용하고 있는지 확실하지 않습니다. 거기에서 RaisePropertyChanged 이벤트 핸들러에 OnPropertyChanged를 래핑합니다. 이벤트를 트리거하면 UI를 업데이트하도록 WPF에 알립니다.

string m_MenuHeader; 
public string MenuHeader 
{ 
    get 
    { 
     return m_MenuHeader; 
    } 
    set 
    { 
     m_MenuHeader=value; OnPropertyChanged("MenuHeader"); 
    } 
}