我一定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>

我找到了 这次讨论 MSDN上的论坛, 博士WPF 建议使用一个 附加行为 为了解决这一问题。他给的例子,下面的怎么会被使用。

<Grid behaviors:CommandBehaviors.EnablingCommand="{x:Static commands:testcommand.test}">  
  . . .  
</Grid> 

虽然这种解决方案似乎是很漂亮我还没有能够投入的时间要了解究竟如何,这种类型的行为将会实现的和什么是参与。如果有人想阐述一下请不要否则我会修改这个答案更多的细节如果我得到机会来探讨这一选择。

我解决我的代码这个问题的方法是在组合框的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的精神很好的实用的解决方案,如果不信

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top