Wpf 使用eventtrigger而不单击
我有一个复选框,设置如下:Wpf 使用eventtrigger而不单击,wpf,mvvm,checkbox,Wpf,Mvvm,Checkbox,我有一个复选框,设置如下: <CheckBox x:Name="ViewTypeCheckbox" IsChecked="{Binding ViewType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click">
<CheckBox x:Name="ViewTypeCheckbox" IsChecked="{Binding ViewType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Refresh}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
这就是它的功能。通过鼠标单击选中或取消选中时,将在ViewModel中激发该命令
您可以看到,复选框被数据绑定到bool属性(“ViewType”),该属性根据用户输入定期从true变为false,反之亦然
问题是当ViewModel选中或取消选中时,我需要触发EventTrigger
我尝试过将“EventName”改为“Checked”、“IsChecked”和“UnChecked”,但似乎没有任何效果
我是否需要实现其他代码?我怎样才能让它工作呢?您不需要交互。触发器, WPF提供了对开箱即用的支持
尝试使用命令属性来简化XAML。它应该可以解决您的问题。如果在选中查看类型复选框时需要调用一些代码,则只需将事件处理程序注册到视图模型的PropertyChanged事件(假设它实现了INotifyPropertyChanged),然后在属性ViewType更改时调用代码:
myViewModel.PropertyChanged += new PropertyChangedEventHandler(onPropertyChanged);
...
private void onPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName=="ViewType")
{
// Do your stuff here
// Ex. fire the Refresh Command
}
}
这可以在ViewModel类本身中完成,也可以根据需要执行。
为了完成该示例,我在viewmodel类中添加了INotifyPropertyChanged
的一个简短实现:
public class MyViewModel : INotifyPropertyChanged
{
...
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler!=null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
...
// property definition to bind to ViewTypeCheckbox.IsChecked
private bool _viewType;
public bool ViewType
{
get { return _viewType; }
set
{
if (value != _viewType)
{
_viewType = value;
RaisePropertyChanged("ViewType");
}
}
}
}
希望它能帮助你,你不需要触发器来执行你的动作。属性更改时,可以在viewmodel中执行此操作
public Boolean ViewType
{
get
{
return this.something;
}
set
{
this.something = value;
if (true == this.something)
{
this.Refresh();
}
}
}
如果VM正在控制ViewType,为什么不能直接调用Refresh()本身呢?这可能有助于@GazTheDestroyer。您可以看到,有问题的命令不存在于任何VIewModel中。它实际上位于一个组件中。我只是想,如果我把“刷新”放进去,解释起来会更容易,或者让人们更容易理解。我真正需要执行的是命令;NavigationCommands.GoToPageNo对此表示怀疑。问题是,“刷新”只是出于解释性的原因放在那里。我希望执行的命令驻留在程序集库中。这正是让我感到棘手的原因。该命令实际上称为“NavigationCommands.GoToPage”。