根据选择禁用/启用ComboBox项

时间:2017-09-15 09:22:00

标签: c# wpf combobox

我有以下ViewModel:

 private MovementType selectedMovementType = MovementType.Continous;
 private bool isMovementSelectable;
 private readonly DeviceSelection DeviceSelection;

 public AxisActionsViewModel(...)
 {
     ....
     this.isMovementSelectable = false;
     this.DeviceSelection.Devices.CollectionChanged
        += this.Devices_CollectionChanged;
     ....
 }


  public bool IsMovementSelectable
  {
     get => this.isMovementSelectable;

     set
     {
        this.isMovementSelectable = value;
        this.OnPropertyChanged();
     }
  }

  private void Devices_CollectionChanged(
     object sender,
     System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  {

      if (this.transportDeviceSelection.TransportDevices.Any(item => item.Name.ToLower().Contains("a"))
        || this.transportDeviceSelection.TransportDevices.Any(item => item.Name.ToLower().Contains("b")))
     {
        this.IsMovementSelectable = false;
     }
     else
     {
        this.IsMovementSelectable = true;
     }
  }

  public IEnumerable<MovementType> MovementTypes
  {
     get
     {
        yield return MovementType.Continous;
        yield return MovementType.Relative;
        yield return MovementType.Absolute;
     }
  }

  public MovementType SelectedMovementType
  {
     get => this.selectedMovementType;

     set
     {
        if (this.selectedMovementType != value)
        {
           this.selectedMovementType = value;

           this.OnPropertyChanged(() => this.SelectedMovementType);

           this.UpdateMovementTemplate();
        }
     }
  }

并在View中查看与ViewModel的IsMovementSelectable属性的绑定

 <UIComboBox Grid.Row="0" Grid.Column="6" Grid.ColumnSpan="6"
                    ItemsSource="{Binding MovementTypes}"
                    SelectedItem="{Binding SelectedMovementType}">

           <UIComboBox.ItemContainerStyle>
              <Style TargetType="UIComboBoxItem">
                 <Setter Property="IsEnabled"
                         Value="{Binding IsMovementSelectable}"/>
              </Style>
           </UIComboBox.ItemContainerStyle>

我现在的问题是,如何正确实现此功能? 我希望当选择A或B时,ComboBox仅包含特定项目。 我在哪里放置IsMovementSelectable属性以获得想要的行为? 我尝试了不同的方法,但都没有产生积极的结果。

1 个答案:

答案 0 :(得分:0)

正如迈克评论的那样,最好的办法就是如果您只是过滤了ComboBox中的内容,请查看hereCollectionView可以轻松地处理您需要做的事情,只需创建一个并将ItemsSource绑定到它。

可能能够维护您当前的方法,并通过使用Visibility属性使用hack来获得所需的行为:

<Setter Property="Visibility" Value="{Binding IsMovementSelectable, Converter={StaticResource BoolToVisibilityConverter}}"/>

您需要创建一个BoolToVisibilityConverter转换器,例如this one。 这没有经过测试,我也不知道你可能得到什么结果,但是如果你不想或不能正确地重写你的代码,这可能就行了。如果幸运的话,它会折叠不应显示的项目。