xamarin 绑定 class 属性
xamarin binding class property
我正在尝试通过 xamarin 为 android 制作一个小应用程序。我也试图包括一些 MVVM。
我有一个模型 class UserInfoM(带有名称、密码...)。我有一个视图模型 "mainpageVM" ,我想在其中使用 class UserInfoM 。这一直有效到一定程度。当我在应用程序中键入内容时,会触发 UserInfoM(odel) 中的 getter 和 setter。但我似乎无法在 VM 中获取数据。这可能是一些明显的错误,但搜索了几天后,我似乎找不到答案。
在我看来 (xaml) 我绑定了 Viewmodel 和
<ContentPage.BindingContext>
<local:MainPageVM/>
</ContentPage.BindingContext>
...
<Entry Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Placeholder="Enter Username"
Text="{Binding UserInfo.User, Mode=TwoWay}"
>
<Entry.BindingContext>
<local:MainPageVM/>
</Entry.BindingContext>
在我的 MainPageVM 中使用 UserInfoM(odel) 作为 属性:
public UserInfoM UserInfo
{
get { return _userInfo ?? (_userInfo = new UserInfoM()); }
set
{
_userInfo = value;
}
}
在我的 UserInfoM(odel) 中,我有以下 属性(除其他外):
private string user;
public string User
{
get { return user; }
set
{
if (user != value)
{
user = value;
RaisePropertyChanged(nameof(User));
}
}
}
因此 xaml 绑定似乎有效,因为触发了 User-属性 getter 和 setter。但仅在模型中,尽管在视图中绑定设置为 MainPageVM。在 MainPageVM 中,所有模型属性都为空。它必须是某种逻辑错误,我没有收到错误,条目填写得很好,UserInfoM(odel) 中的 user-属性 由条目字段填写(设置)但是我不能 access/use 来自模型的 UserInfo.User(或其他)属性。
简而言之,我可以绑定一个 属性,但不能绑定另一个 class 的属性。我看了一堆教程并搜索了很多但找不到这个。
我希望解释足够清楚......任何帮助将不胜感激。
raise属性 方法实现了 INotifyPropertyChanged 并且非常适合单个 属性。 de UserInfoM(odel) 中的 user-属性 已更新,但 Viewmodel 中的用户未更新。
您不需要将 BindingContext 显式设置为您的条目。当您为您的页面设置绑定上下文时,它适用于其中的所有元素。你对Entry的绑定是正确的,所以应该变成这样:
<Entry Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Placeholder="Enter Username"
Text="{Binding UserInfo.User, Mode=TwoWay}">
如果您像这样替换代码,Entry 将成功找到它的 BindingContext(从页面的 BindingContext),它将在其中查找 UserInfo class 并将绑定 UserInfo 的 User 属性 到条目的文本 属性.
我正在尝试通过 xamarin 为 android 制作一个小应用程序。我也试图包括一些 MVVM。 我有一个模型 class UserInfoM(带有名称、密码...)。我有一个视图模型 "mainpageVM" ,我想在其中使用 class UserInfoM 。这一直有效到一定程度。当我在应用程序中键入内容时,会触发 UserInfoM(odel) 中的 getter 和 setter。但我似乎无法在 VM 中获取数据。这可能是一些明显的错误,但搜索了几天后,我似乎找不到答案。
在我看来 (xaml) 我绑定了 Viewmodel 和
<ContentPage.BindingContext>
<local:MainPageVM/>
</ContentPage.BindingContext>
...
<Entry Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Placeholder="Enter Username"
Text="{Binding UserInfo.User, Mode=TwoWay}"
>
<Entry.BindingContext>
<local:MainPageVM/>
</Entry.BindingContext>
在我的 MainPageVM 中使用 UserInfoM(odel) 作为 属性:
public UserInfoM UserInfo
{
get { return _userInfo ?? (_userInfo = new UserInfoM()); }
set
{
_userInfo = value;
}
}
在我的 UserInfoM(odel) 中,我有以下 属性(除其他外):
private string user;
public string User
{
get { return user; }
set
{
if (user != value)
{
user = value;
RaisePropertyChanged(nameof(User));
}
}
}
因此 xaml 绑定似乎有效,因为触发了 User-属性 getter 和 setter。但仅在模型中,尽管在视图中绑定设置为 MainPageVM。在 MainPageVM 中,所有模型属性都为空。它必须是某种逻辑错误,我没有收到错误,条目填写得很好,UserInfoM(odel) 中的 user-属性 由条目字段填写(设置)但是我不能 access/use 来自模型的 UserInfo.User(或其他)属性。
简而言之,我可以绑定一个 属性,但不能绑定另一个 class 的属性。我看了一堆教程并搜索了很多但找不到这个。 我希望解释足够清楚......任何帮助将不胜感激。 raise属性 方法实现了 INotifyPropertyChanged 并且非常适合单个 属性。 de UserInfoM(odel) 中的 user-属性 已更新,但 Viewmodel 中的用户未更新。
您不需要将 BindingContext 显式设置为您的条目。当您为您的页面设置绑定上下文时,它适用于其中的所有元素。你对Entry的绑定是正确的,所以应该变成这样:
<Entry Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Placeholder="Enter Username"
Text="{Binding UserInfo.User, Mode=TwoWay}">
如果您像这样替换代码,Entry 将成功找到它的 BindingContext(从页面的 BindingContext),它将在其中查找 UserInfo class 并将绑定 UserInfo 的 User 属性 到条目的文本 属性.