我有以下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属性以获得想要的行为? 我尝试了不同的方法,但都没有产生积极的结果。
答案 0 :(得分:0)
正如迈克评论的那样,最好的办法就是如果您只是过滤了ComboBox中的内容,请查看here。
CollectionView
可以轻松地处理您需要做的事情,只需创建一个并将ItemsSource
绑定到它。
您可能能够维护您当前的方法,并通过使用Visibility属性使用hack来获得所需的行为:
<Setter Property="Visibility" Value="{Binding IsMovementSelectable, Converter={StaticResource BoolToVisibilityConverter}}"/>
您需要创建一个BoolToVisibilityConverter
转换器,例如this one。
这没有经过测试,我也不知道你可能得到什么结果,但是如果你不想或不能正确地重写你的代码,这可能就行了。如果幸运的话,它会折叠不应显示的项目。