c# - 一个简单的 Wpf MVVM 绑定(bind)问题

标签 c# wpf mvvm

我正在尝试 WPF MVVM。我在 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>

我有一个带有属性 MenuHeaderMenuItemsMenuViewModel。我在运行时获取这两个属性的值。前者绑定(bind)到 TextBlock 的文本,后者绑定(bind)到 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");
            }

        }
    }

提前致谢。

最佳答案

您正在使用 ViewModel 的默认构造函数在 XAML 中创建 ViewModel,该构造函数不执行任何操作。您的所有人口代码都位于从未被调用的非默认构造函数中。

更常见的方法是在代码中创建 ViewModel,然后显式使用 View.DataContext = ViewModel 或隐式使用 DataTemplate 将其注入(inject) View 。

关于c# - 一个简单的 Wpf MVVM 绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072430/

相关文章:

c# - 理解 MemoryMarshal.Cast 的返回值

c# - "Couldn' t 找到一个 IPlatformOperations。这永远不应该发生,你的依赖解析器在 WPF 上被破坏了

c# - 在 WPF 中找不到附加属性

c# - 更新 ViewModel 属性时如何避免递归?

c# - 如何将多个 View 模型绑定(bind)到 MVVM wpf 中的单个 xaml 文件?

c# - 如何强制 DotNet 框架使用 JIT 而不是 NGEN?

c# - 如何以编程方式获取 UWP 标题栏默认颜色

c# - 下拉列表数据源并从 C# 添加额外项目

c# - MVVM light Messenger 中的 Action 、局部变量和垃圾收集的奇怪行为

c# - 在 Silverlight 和 MVVM 的组合根中保持 DI 容器的使用