gpt4 book ai didi

c# - DataTrigger 中的 Setter 似乎没有触发

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:03 25 4
gpt4 key购买 nike

我们正在使用 MVVMLight 开发 Xamarin Forms (v2.3.0.107) 应用程序,主要在 XAML 中实现。

几个月来,我们的应用程序中有一个 LoginView,它使用 DataTriggers 来显示登录过程中的当前步骤(环境选择 -> 凭据 -> 验证码).到目前为止, View 一直在完成它的一部分,但现在它甚至不显示任何内容,就好像 DataTriggers 从未被触发。此 View 及其 ViewModel 没有直接更改任何内容,大多数间接更改与问题无关。

登录 View

<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>

登录 View 模型

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 来调试绑定(bind):

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 的绑定(bind)更改为:

Binding="{Binding LoginStatus, Converter={StaticResource DebugConverter}, ConverterParameter={x:Static viewmodels:LoginStatus.Login}}"

这使我能够验证我从 ViewModel 收到的任何内容确实是我在 DataTrigger 中提供的值。事实上,转换器中的 valueparameter 参数都是枚举值 MyProject.ViewModels.LoginStatus.Login。甚至当我快速查看 value == parameter 时,我得到的结果也是 true。

此外,当我将 StackLayoutIsVisible 设置为 True 时,它​​显示内容。

这告诉我什么?

  • 我的 LoginView 的 BindingContext 绑定(bind)到 LoginViewModel
  • 我的 DataTrigger 的绑定(bind)确实绑定(bind)到 LoginStatus 并且具有正确的值(无论如何这最初都不应该改变)。
  • 我的 DataTrigger 中的值也返回正确的值。
  • DataTrigger 的条件有效,因此 Setter 应该触发。

我已经在 WPF 中实现了很多这样的基本触发器,并且它一直在 Xamarin 中工作。为什么这个实现突然决定失败?我一定已经检查了 Setter 实现大约 10 次,但我就是看不到语法中的任何错误。

我错过了什么吗?根据搜索结果,这不是一个常见问题...

最佳答案

问题的根源是我自己的愚蠢错误...

我扩展了我们的 NavigationService 以允许定义可选的 ViewModel,但我忘记验证传递的 ViewModel 是否不为空。因此,在 ViewModelLocator 初始化 BindingContext 之后,NavigationService 将使用 null 覆盖 BindingContext

我没有注意到此行为,因为当 BindingContext 设置为 null 时,不会调用 DebugConverter。相反,它将使任何使用 BindingContext 的触发器无效,并恢复任何被调用的 setter 。

关于c# - DataTrigger 中的 Setter 似乎没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com