【发布时间】:2016-07-12 16:20:21
【问题描述】:
我有一个设置为 DataTemplate 的控件:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<DataTemplate x:Key="KEYBOARD_EN">
<StackPanel>
<Button Visibility="{Binding Path=RegisterButtonVisible}" Style="{StaticResource RegisterKeyboardButtonStyle}">Register</Button>
</StackPanel>
</DataTemplate>
在这个 DataTemplate 中有一个控件,我希望在其上设置各种视图模型的可见性:
<Button Visibility="{Binding Path=RegisterButtonVisible}" Style="{StaticResource ...} > Register </Button>
我用我的控件做路由事件,所以我尝试设置类似的东西,但无论我尝试什么,RegisterButtonVisible 属性都不会被拾取:
public partial class MainKeyboard : UserControl
{
public static DependencyProperty RegisterButtonVisibleProperty;
public Visibility RegisterButtonVisible
{
get { return (Visibility)GetValue(RegisterButtonVisibleProperty); }
set { SetValue(RegisterButtonVisibleProperty, value); }
}
static MainKeyboard()
{
RegisterButtonVisibleProperty = DependencyProperty.Register("RegisterButtonVisible", typeof (Visibility),
typeof (MainKeyboard));
}
}
在我的 ViewModel 中我这样做:
public Visibility RegisterButtonVisible // get, set, raisepropchange, etc
我的带有按钮的 DataTemplate 包含在 userControl 中:
<UserControl x:Class="Bleh.Assets.MainKeyboard"
x:Name="TheControl"
Unloaded="UserControl_Unloaded">
<Viewbox>
<Grid>
<ContentControl Name="ctrlContent" Button.Click="Grid_Click" />
</Grid>
</Viewbox>
在我的观点中使用如下:
<assets:MainKeyboard
RegisterButtonVisible="Collapsed"
Loaded="MainKeyboard_Loaded">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Register">
<b:InvokeCommandAction Command="{Binding ConfirmEmailAddressCommand}"/>
</b:EventTrigger>
<b:EventTrigger EventName="Enter">
<b:InvokeCommandAction Command="{Binding EnterKeyCommand}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</assets:MainKeyboard>
请注意这个属性:
RegisterButtonVisible="Collapsed"
这是我的依赖属性。它显示在智能感知中,因此 CLR 已正确注册它,但它没有获取属性分配(Collapsed 被忽略)。
这让我觉得它非常接近,但我记得有人告诉我我不能这样做,因此 EventTriggers(这显然是数据模板和 MVVM 的常见问题)。
所以一种选择是在 Interaction 命名空间中使用某些东西,就像我做我的事件触发器一样(我只需要以某种方式在这个按钮上触发一个“可见性”触发器,至少我认为)。
什么是正确的在MVVM中做这件事的任何方式?
【问题讨论】:
-
不要纠结于正确/错误...这真的归结为更容易保持前进。恕我直言。我会如您所示在VM上进行可见性,并从其他属性触发它,并在代码中为此效果添加一个很好的注释。
-
我同意;我只是想以 MVVM 的方式做事;首先查看所有内容。但我绝对同意你的看法。
标签: wpf mvvm wpf-controls visibility datatemplate