如何结合一ComboBoxItem的启用的财产结果有命令的执法
-
22-09-2019 - |
题
我一定SplitButton实现,其中包含一个组合框几个ComboBoxItems开的命令。我可以结合的名称和文字性质的命令就好了但没有办法结合ComboBoxItem的 启用 酒店的结果命令是 项 方法,因为它是一种方法。是有某些语法,我不知道的对于结合的方法,或是有些诡计,将帮助我结合执.
顺便说一句,我已经想过使用定制ValueConverter除了那我意识到,我可能不会接受任何更新项重新进行评估,因为它不是酒店,因为我的命令不业务的对象。它找到我,我可能必须创建一个模型为一个命令在这一点上使用仅在我自定义SplitButton控制,但这似乎有点过分给我。
解决方案 2
由视图模型的另一种解决方案。下面是我如何使用视图模型来解决我的问题。而且请注意,漂亮NotifyPropertyChanged方法是我的基地ViewModel类的一部分。
public class RoutedUICommandViewModel : ViewModel
{
private RoutedUICommand _command;
private IInputElement _target;
public string Name { get { return _command.Name; } }
public string Text { get { return _command.Text; } }
public bool CanExecute
{
get
{
return _command.CanExecute(null, _target);
}
}
public RoutedUICommand Command { get { return _command; } }
public RoutedUICommandViewModel(ReportCommand command, IInputElement target)
{
_command = command;
_target = target;
_command.CanExecuteChanged += _command_CanExecuteChanged;
}
private void _command_CanExecuteChanged(object sender, EventArgs e)
{
base.NotifyPropertyChanged(() => this.CanExecute);
}
}
其他提示
您可以把一个按钮(如果你没有一个在绑定到ICommand设置控件模板)内ItemContainerStyle(ComboBoxItem风格)和bind命令它 并添加一个触发检查Button.IsEnabled和值设置为ComboBoxItem。所以在这里我们使用的纽扣作为CommandSource只是为了让从CanExeute中的IsEnabled。可以将按钮的高度和宽度设置成零
<ControlTemplate....>
<Grid ...
<Button x:Name="dummyButton" Command="{Binding YourCommand}" ....
......
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="dummyButton" Property="IsEnabled" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</Trigger>
</ControlTemplate.Triggers>
我解决我的代码这个问题的方法是在组合框的PreviewMouseDown事件添加事件处理程序。这里的处理程序:
private void comboBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
ViewModel vm = this.DataContext as ViewModel;
if (vm != null)
{
if (!vm.CanChangeSelection())
{
e.Handled = true;
vm.RespondToFailedAttemptChangeUnits();
}
}
}
这是我唯一需要做的这一个位置的情况下,我的伟大工程。如果我有多少个这样它可能会有点tedius。
此外,尽管我按照MVVM模式,我不是一个纯粹的 - 我认为这是遵循MVVM的精神很好的实用的解决方案,如果不信
。