- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在使用 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 中提供的值。事实上,转换器中的 value
和 parameter
参数都是枚举值 MyProject.ViewModels.LoginStatus.Login
。甚至当我快速查看 value == parameter
时,我得到的结果也是 true。
此外,当我将 StackLayout
的 IsVisible
设置为 True 时,它会显示内容。
这告诉我什么?
LoginView
的 BindingContext 绑定(bind)到 LoginViewModel
。LoginStatus
并且具有正确的值(无论如何这最初都不应该改变)。我已经在 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/
我想使用带有 DataTrigger 的样式来定义 ResourceDictionary 中控件的一般外观。 是否可以在 View 中指定DataTrigger绑定(bind)路径?如果没有,是否有一
我需要根据用户与搜索功能的交互动态添加 DataTrigger,因此无法在 XAML 中完成。但是,从下面的 XAML 代码中可以看出我正在尝试做的事情的基本目标。它需要根据 ToggleButton
我有一个名为 OperativeCount 的值。当此数字大于 10 时,我希望 DataGridColumn 的颜色发生变化。类似于此; 10"
我在我的 XAML 中定义了一个 DataTrigger,我想在多个地方使用它。是否可以将其定义为资源然后共享? 这是我的触发器:
所以这是我的 XAML:
我正在尝试将我的一些 WPF 技能转换为 Silverlight,并且在我一直在开发的测试迷你应用程序中遇到了一个稍微奇怪的问题。在 WPF 中,我习惯于在样式中使用 DataTriggers 来根据
是否可以使用 DataTrigger 在 WPF 中设置 RotateTransform 的角度?如果是这样,如何? 最佳答案 当然,这样的事情应该有效
我知道我可以创建一个 setter 来检查值是否为 NULL 并执行某些操作。示例:
所以我刚刚加入了一个 Windows Phone 团队,他们倾向于按照以下方式做一些事情: 我查看了它并心想:代码重复,将 2 个元素加载到 UI,这(虽然很小)加载了不必要的内存 - 为什么在任
正如 WPF 经常发生的那样,我可能会以错误的方式处理事情,但我有以下情况: 我想根据 DataTrigger 应用样式,但您不能从样式内部更改样式:
我希望我的 TextBox 有一个 红色背景如果 ViewModel 属性 =“ 无效 ”。我必须改变什么才能有效? 这个版本告诉我背景没有合格的类型名称 .
我有几个项目控件,我需要为它们附加一个事件处理程序 PreviewMouseLeftButtonDown 事件仅在满足某个条件时发生。 我用数据触发器为我的控件设计了一种样式,我检查了它的绑定(bin
当我的绑定(bind)表字段时,我希望我的图像可见性属性设置为隐藏 Weblink = NULL **OR** Weblink = "" 使用 MultiDataTrigger,您可以按以下逻辑测试多
有没有人有一个成功的解决方法来根据基础数据对象的属性更改 Silverlight 中的样式,因为当值更改时,样式也会更改。我简要地使用了 WPF,它显然有 DataTrigger,它似乎涵盖了这一点,
【原创】 我有一个 ListBox有它的ItemsSource (这是在创建窗口时在后面的代码中完成的)数据绑定(bind)到 ObservableCollection . ListBox然后有以下D
我正在使用 MVVM,所以我需要绑定(bind)一个矩形形状的属性,该属性最终会对其进行动画处理。 我发现很少solutions并试图复制他们的方法,但故事范围没有发挥作用 我包括我的源代码
我有一个动画可以将边框(使用渲染转换变换)移动到它的宽度。此动画需要应用于多个边框,并且这些边框的宽度会有所不同。所以我将动画关键帧的 Value 属性绑定(bind)到边框的 ActualWidth
我有一个 WPF 数据触发器,该触发器设置为在值为 true 时触发。 我希望每次该值设置为 true 时都会触发此触发器,即使它之前是 true。不幸的是,它似乎只有在值从 true 更改为 fal
我有一个数据模板。它有两种视觉状态——展开、折叠。我添加了 2 个 GoToStateAction-s。第一个在数据上下文属性变为 True 时进入 Expanded 状态,第二个在同一属性变为 Fa
我是一名优秀的程序员,十分优秀!