2

WPFMVVMを試してみました。XAMLで次のコードを記述しました

<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>

私はMenuViewModelプロパティMenuHeaderとを持っていますMenuItems。実行時に両方のプロパティで値を取得します。前者はのテキストにバインドされTextBlock、後者はのItemSourceにバインドされますListBox。しかし、ソリューションを実行すると、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");
            }

        }
    }

前もって感謝します。

4

2 に答える 2

3

何もしないViewModelのデフォルトのコンストラクターを使用して、XAMLでViewModelを作成しています。すべての人口コードは、呼び出されることのないデフォルト以外のコンストラクターにあります。

View.DataContext = ViewModelより一般的な方法は、ViewModel をコードで作成し、明示的に を使用して、または暗黙的に DataTemplate を使用してビューに挿入することです。

于 2012-04-09T11:43:10.700 に答える
1

OnPropertyChanged イベントをトリガーする必要があると思います。MVVM ライブラリを使用しているかどうかはわかりません (ViewModelBase から継承しているため、たとえば MVVM Light を使用している可能性があります)。RaisePropertyChanged イベント ハンドラーで OnPropertyChanged をラップします。イベントをトリガーすると、UI を更新するように WPF に通知されます。

string m_MenuHeader;
public string MenuHeader 
{ 
    get
    {
        return m_MenuHeader;
    } 
    set
    {
        m_MenuHeader=value; OnPropertyChanged("MenuHeader");
    }
}
于 2012-04-09T11:48:09.803 に答える