【发布时间】:2016-11-09 10:21:03
【问题描述】:
我们正在使用 MVVMLight 开发一个 Xamarin Forms (v2.3.0.107) 应用程序,主要在 XAML 中实现。
几个月来,我们的应用程序中有一个LoginView,它使用DataTriggers 来显示登录过程中的当前步骤(环境选择-> 凭据-> 验证码)。到目前为止,该视图一直是它的一部分,但现在它甚至没有显示任何内容,好像永远不会触发 DataTriggers。
此 View 及其 ViewModel 上没有直接更改任何内容,并且大多数间接更改与问题无关。
登录视图
<ContentPage
x:Class="MyProject.Views.LoginView"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewmodels="clr-namespace:MyProject.ViewModels;assembly=MyProject"
BindingContext="{Binding [LoginViewModel], Source={StaticResource ViewModelLocator}}">
<Grid>
<StackLayout
IsVisible="False">
<StackLayout.Triggers>
<DataTrigger
TargetType="StackLayout"
Binding="{Binding LoginStatus}"
Value="{x:Static viewmodels:LoginStatus.Login}">
<Setter
Property="IsVisible"
Value="True" />
</DataTrigger>
</StackLayout.Triggers>
...
</StackLayout>
...
</Grid>
</ContentPage>
登录视图模型
namespace MyProject.ViewModels
{
public enum LoginStatus
{
Login,
EnvironmentSelection,
InstanceSelection,
VerificationCode
}
public class LoginViewModel : BaseViewModel
{
private LoginStatus _loginStatus;
public LoginStatus LoginStatus
{
get { return _loginStatus; }
private set { Set(ref _loginStatus, value); }
}
public LoginViewModel()
{
LoginStatus = LoginStatus.Login;
}
}
}
到目前为止我所做的尝试
我使用以下DebugConverter 来调试绑定:
public class DebugConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Debugger.Break();
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Debugger.Break();
return value;
}
}
我已将 StackLayout DataTrigger 的绑定更改为:
Binding="{Binding LoginStatus, Converter={StaticResource DebugConverter}, ConverterParameter={x:Static viewmodels:LoginStatus.Login}}"
这允许我验证我从 ViewModel 收到的任何内容确实是我在 DataTrigger 中提供的值。事实上,转换器中的value 和parameter 参数都是枚举值MyProject.ViewModels.LoginStatus.Login。即使我在value == parameter 上快速观看,结果也是如此。
此外,当我将 StackLayout 的 IsVisible 设置为 True 时,它确实向我显示内容。
这告诉我什么?
- 我的
LoginView的BindingContext 绑定到LoginViewModel。 - 我的 DataTrigger 的 Binding 确实绑定到
LoginStatus并且具有正确的值(这甚至不应该一开始就改变)。 - 我的 DataTrigger 中的值也返回正确的值。
- DataTrigger 的条件有效,所以 Setter 应该触发。
我已经在 WPF 中实现了很多这样的基本触发器,并且它一直在 Xamarin 中工作。为什么这个实现突然决定失败?我一定已经检查了 Setter 实现大约 10 次,但我只是看不到语法中的任何错误。
我错过了什么吗?根据搜索结果,这不是常见问题...
【问题讨论】:
-
Binding的输出窗口中是否有任何错误?您是否尝试过更改TraceLevel以尝试获取更多有用的信息? link -
这在 PCL 中似乎不受支持,我猜它是用于 WPF 应用程序的?我读过在 iOS 中调试时绑定跟踪不起作用,我用它来调试。不幸的是,由于一些不兼容错误,我目前也无法在 android 中运行。
-
哦,这很痛苦。如果转换器正在工作并且 value 参数与预期的
LoginStatus一起通过,您能否修改转换器以返回bool来驱动IsVisible属性? -
听起来是一个有价值的解决方案,但不幸的是现在的结果完全相反。使用这样的转换器来验证相等性会同时显示所有单独的内容,而转换器只返回一次 true,对于所有其他内容视图返回 false。我刚刚注意到命令也不起作用,所以结构上有问题。自
InitializeComponent()以来,视图似乎对任何更改都没有反应。 -
我找到了问题的根源,我自己的愚蠢错误......我会在几分钟后发布答案以记录下来。
标签: c# xaml xamarin xamarin.forms