c# - 未能成功地将我的 ViewModel 数据公开给我的 XAML 绑定(bind) View

标签 c# wpf xaml mvvm binding

我正在构建一个 Windows 通用应用程序并尝试将数据从我的 ViewModel 公开到我的 View ,以便我可以将它绑定(bind)到 XAML 元素。在这一点上,我已经完全注释掉了我的所有代码,我只是编写了几行测试代码来尝试让它工作,这就是下面示例中的内容。直接从 View 绑定(bind)(如果我在那里创建一个对象作为测试)确实有效。

请帮助我了解我哪里出错了,我想我已经阅读了互联网上的所有绑定(bind)教程,但仍然不明白。

查看( MainPage.xaml.cs ):

public MainPage()
{   
    InitializeComponent();
    DataContext = new MainViewModel();

}

ViewModel ( MainViewModel.cs ):
public class MainViewModel
{
    public Term newTerm = new Term
    {
        TermName = "Table",
        TermDescription = "You eat dinner on it"    
    };
}

XAML( MainPage.xaml ):
<StackPanel DataContext="{Binding newTerm}" x:Name="mvvmStack" Orientation="Vertical">
    <TextBlock x:Name="mvvmTermName" Text="{Binding TermName,  FallbackValue='Fallingback'}" />
    <TextBlock x:Name="mvvmDescription" Text="{Binding TermDescription, FallbackValue='Fallingback', TargetNullValue='Unknown'}" />
</StackPanel>

我得到的错误是:
Error: BindingExpression path error: 'newTerm' property not found on ''. BindingExpression: Path='newTerm' DataItem=''; target element is 'Windows.UI.Xaml.Controls.StackPanel' (Name='mvvmStack'); target property is 'DataContext' (type 'Object')

我已经阅读过这种类型的错误,虽然我知道它想说什么,但我无法弄清楚如何解决它。我是一个非常完整的编码初学者,尤其是 C#,所以请在回答时考虑到这一点:-)

最佳答案

只需尝试将其从字段更改为属性,它将正常工作。您不能绑定(bind)到字段。
编辑:

private Term _term;
public Term NewTerm{
    get{return _term;}
    set
    {
       _term= value;
       OnPropertyChanged("Term");
    }
}

如果您需要在 View 模型中添加通知 View 更改,则需要实现 INotifyPropertyChanged。
检查此答案,它将提供更改属性的示例。 https://stackoverflow.com/a/27685925/1448382

如果要将 View 绑定(bind)到子属性,则根据情况有两种选择:

1- 相对绑定(bind):当您不会从 ViewModel 修改 Term 对象内的属性时使用此方案,即它们将在 viewmodel 中初始化并且可以在 View 中进行修改,就像您这样做的方式一样。请注意,您需要绑定(bind)的任何内容都应该是属性而不是字段。

2- 直接绑定(bind)到 Viewmodel:当您在 View 加载后从 Viewmodel 修改 Term 对象内的属性时使用此方案。这样,您将需要向 View 模型中添加属性 TermName 和 TermDescription 的属性。
public string TermName{
    get{return NewTerm.Name;}
    set{NewTerm.Name = value;
        OnPropertyChanged("TermName");
    }//The same is applied for TermDescription

但请注意,您需要删除 Stackpanel 对象上的绑定(bind),因为您已直接在 Viewmodel 中定义了属性。

关于c# - 未能成功地将我的 ViewModel 数据公开给我的 XAML 绑定(bind) View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020312/

相关文章:

c# - WPF ProgressBar 宽度不调整到文本

c# - 在 .net Framework 2.0 中使用 Linq?

c# - 我可以判断某个属性是否已通过 Rhino Mocks 访问

c# - WPF TextBox 在验证时设置红色边框

c# - 改变 parent 的风格

xaml - 在 xaml 中使用自定义字体

.net - 在 WPF/Silverlight ListBox 中的项目之间添加空格,第一个上方或最后一个下方没有空格

c# - 从代码隐藏更改母版页中的控件属性后出现问题

c# - 我需要帮助使用 C# 拆分命令拆分 .csv 文件中的记录

c# - 加载作为我的解决方案一部分的 FlowDocument.xaml