Вы можете реализовать некоторые представления логики c для включения / выключения кнопки всякий раз, когда изменяется выбор сборщика. Это не нарушило бы паттерн MVVM, потому что это просто просмотр логи c.
Но более элегантный способ - это изменить измененную ViewModel, например
public class MainViewModel : ReactiveObject
{
private Material _material;
private Pocket _selectedPocket;
private readonly ObservableCollection<Pocket> _pockets;
public MainViewModel()
{
var canExecuteAddToPocketCommand = this
.WhenAnyValue( e => e.SelectedPocket )
.Select( e => e != null );
AddToPocketCommand = ReactiveCommand.CreateFromTask(
ExecuteAddToPocketCommandAsync,
canExecuteAddToPocketCommand );
Material = new Material { Name = "Material Name", Description = "Material Description" };
_pockets = new ObservableCollection<Pocket>( Enumerable.Range( 1, 10 ).Select( id => new Pocket { PocketName = $"Pocket {id}" } ).ToList() );
Pockets = new ReadOnlyObservableCollection<Pocket>( _pockets );
}
private async Task ExecuteAddToPocketCommandAsync()
{
await Task.Delay( 250 );
SelectedPocket = null;
}
public Material Material { get => _material; set => this.RaiseAndSetIfChanged( ref _material, value ); }
public ICollection<Pocket> Pockets { get; }
// *** ADDED PROPERTY ***
public Pocket SelectedPocket { get => _selectedPocket; set => this.RaiseAndSetIfChanged( ref _selectedPocket, value ); }
public ICommand AddToPocketCommand { get; }
}
Команда сейчас сообщает себе , может ли он быть выполнен или нет, и представление включит / отключит элемент управления для представления этого состояния.
Затем само представление может быть упрощено до:
<StackLayout Padding="15" Spacing="20">
<Label FontSize="Medium" Text="Text:" />
<Label
d:Text="Item name"
FontSize="Small"
Text="{Binding Material.Name}" />
<Label FontSize="Medium" Text="Description:" />
<Label
d:Text="Item description"
FontSize="Small"
Text="{Binding Material.Description}" />
<Picker
Title="--Select--"
ItemDisplayBinding="{Binding PocketName}"
ItemsSource="{Binding Pockets}"
SelectedItem="{Binding SelectedPocket}" />
<Button Command="{Binding AddToPocketCommand}" Text="Add To" />
</StackLayout>
К вашему сведению: ViewModel использует пакет NuGet ReactiveUI.XamForms