未能成功将我的 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 已更改
我正在构建一个 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 已更改