如何解决Xamarin.Forms:部分视图的VM和父级的VM之间的通信 PrtialView.xaml: PrtialView.xaml.cs: ParentView.xaml:
我已经使用自己的ViewModel实现了局部视图,因此可以在不同的ContentPage
中使用它。但是,此部分视图还必须具有将绑定到父级VM的某些属性。 (并且应该在任何第三方库如Prism的干预下)
这是一个示例:
PrtialView
PrtialView.xaml:
<StackLayout x:Class="....OtpVerificator" ...>
<Entry x:Name="Otp1Entry"></Entry>
<Entry x:Name="Otp2Entry"></Entry>
<Entry x:Name="Otp3Entry"></Entry>
<Entry x:Name="Otp4Entry"></Entry>
<Entry x:Name="Otp5Entry"></Entry>
<Entry x:Name="Otp6Entry"></Entry>
</StackLayout>
PrtialView.xaml.cs:
public partial class OtpVerificator : StackLayout
{
//.....
// For example I want also set this property from the parent's view or vVM
public static readonly BindableProperty TokenProperty = BindableProperty.Create(nameof(Token),typeof(string),typeof(OtpVerificator),default(string),Xamarin.Forms.BindingMode.TwoWay);
public string Token
{
get
{
return (string)GetValue(TokenProperty);
}
set
{
SetValue(TokenProperty,value);
}
}
protected override void OnPropertyChanged(string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (propertyName == TokenProperty.PropertyName)
{
if (Token != EntriesFullText)
{
for (int i = 0; i < Token.Length; i++)
otpEntries[i].Text = Token.Substring(i,1);
}
}
//......
}
// .......
private string EntriesFullText
{
get => string.Join(string.Empty,otpEntries
.Where(e => !string.IsNullOrEmpty(e.Text))
.Select(e => e.Text[0]));
}
private void OtpEntry_Changed(object sender,TextChangedEventArgs e)
{
if (Token != EntriesFullText)
Token = EntriesFullText;
var oldVal = e.OldTextValue ?? string.Empty;
var newVal = e.NewTextValue ?? string.Empty;
var entry = sender as BorderlessEntry; // .. and check for null
var index = otpEntries.IndexOf(entry); // what if IndexOf returns -1?
// allow for a single val
if (!string.IsNullOrEmpty(entry.Text) && !string.IsNullOrEmpty(oldVal))
entry.Text = newVal.All(nw => nw.ToString() == oldVal) ? oldVal : entry.Text.Replace(oldVal,string.Empty);
if (string.IsNullOrEmpty(entry.Text))
return;
var nextIndex = index + 1;
if (nextIndex >= otpEntries.Length)
entry.Unfocus();
else
{
var next = otpEntries.ElementAt(nextIndex);
next?.Focus();
}
}
}
ParentView.xaml:
我知道Token
属于嵌入式VM,因此我写了Token2来解释它是PV的不同属性,应该可以从父级的视图或父级的VM(绑定)中设置>
<ContentPage x:Class="....ParentPage">
<partials:OtpVerificator x:Name="otpVerifier"
Grid.Row="2"
HorizontalOptions="CenterAndExpand"
ActionType="LoginConfirmation"
Token2="123658">
</partials:OtpVerificator>
</ContentPage>
解决方法
尝试给您的parentView命名并像这样进行绑定:
Token2="{Binding BindingContext.token2,Source={x:Reference parentView}}"
这里是示例:
<ContentPage x:Class="....ParentPage" x:Name="parentView">
<partials:OtpVerificator x:Name="otpVerifier"
Grid.Row="2"
HorizontalOptions="CenterAndExpand"
ActionType="LoginConfirmation"
Token2="{Binding BindingContext.token2,Source={x:Reference parentView}}">
</partials:OtpVerificator>
</ContentPage>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。