2012-04-09 11 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は空になります。

編集:事前にコードのViewModel

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から継承しているため)、OnPropertyChangedをRaisePropertyChangedイベントハンドラにラップします。 イベントをトリガすると、WPFにUIの更新が通知されます。

string m_MenuHeader; 
public string MenuHeader 
{ 
    get 
    { 
     return m_MenuHeader; 
    } 
    set 
    { 
     m_MenuHeader=value; OnPropertyChanged("MenuHeader"); 
    } 
} 
関連する問題