未能成功将我的 ViewModel 数据公开到我的视图以进行 XAML 绑定

Failing to successfully expose my ViewModel data to my View for XAML binding

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

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

查看(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#,所以请在回答时考虑到这一点:-)

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

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

如果你需要在你需要实现 INotifyPropertyChanged 的​​视图模型中添加通知视图更改。 检查此答案,它将提供 属性 更改的示例。

如果要绑定视图到子属性,根据情况有两种选择:

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

2- 直接绑定到 Viewmodel:当您将在视图加载后从 Viewmodel 修改 Term 对象内的属性时使用此方案。这样,您将需要为属性 TermName 和 TermDescription 添加属性到视图模型。

public string TermName{
    get{return NewTerm.Name;}
    set{NewTerm.Name = value;
        OnPropertyChanged("TermName");
    }//The same is applied for TermDescription

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

尝试这样的事情:

<Page.Resources>
    <viewModels:MainViewModel x:Key="MainViewModel" />
</Page.Resources>

然后:

<StackPanel x:Name="mvvmStack" Orientation="Vertical">
            <TextBlock x:Name="mvvmTermName" Text="{Binding newTerm.TermName, Source={StaticResource MainViewModel}  FallbackValue='Fallingback'}" />
            <TextBlock x:Name="mvvmDescription" Text="{Binding newTerm.TermDescription, Source={StaticResource MainViewModel} FallbackValue='Fallingback', TargetNullValue='Unknown'}" /></StackPanel>

当然 newTerm 应该在 属性 中,INotify 已更改