WPF / MVVM: Отключить состояние кнопки, когда ViewModel за UserControl еще не инициализирован? - PullRequest
9 голосов
/ 12 декабря 2010

У меня есть DocumentListView.Xaml с ListBox и 3 кнопками.

За тем, что UserControl содержит DocumentListViewModel с 3 кнопками, а их свойство Command связано с 3 RelayCommands.

У меня есть 3 контроллера, например AdministrationController, BillingController, ReportController.

Каждый контроллер имеетObservableCollections, например, Customer 1: N Order 1: N Документ такой же для другого контроллера.

В одном контроллере у меня есть особая ситуация привязки.Когда мой DocumentListViewModel не инициализируется его родительским ViewModel, таким как OrderViewModel (потому что никакие заказы не загружены / не существуют), тогда мой UserControl имеет 3 кнопки, которые ВКЛЮЧЕНЫ.Хорошо, пользователь может нажать 3 кнопки, и ничего не происходит, но все же это очень сбивает с толку, и, прежде всего, пропала согласованность в моем пользовательском интерфейсе.

Как я могу установить для команды кнопки по умолчанию значение "Отключено"?

Установка для свойства Istons Islenable кнопки значения false не помогает, потому что кнопка навсегда останется в отключенном состоянии.Никакая CanExecute TRUE не установит его в IsEnabled = true.

И я не хочу вводить другое свойство IsButtonEnabled ... это глупо, потому что тогда у меня есть обе миры winforms и wpf за моей логикой кнопок ... ICommand долженхватит.

Ответы [ 2 ]

19 голосов
/ 13 декабря 2010

Или вы можете использовать стиль для кнопки, чтобы отключить:

<Style TargetType="{x:Type Button}" x:Key="DisablerButton">
    <Style.Triggers>
        <Trigger Property="Command" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False" />
        </Trigger>
    </Style.Triggers>
</Style>
5 голосов
/ 12 декабря 2010

Это интересная ситуация.Честно говоря, я никогда не сталкивался со случаем, когда пользовательский интерфейс был загружен и интерактивен, но ViewModel еще не был привязан.

Однако, игнорируя это на мгновение, вы можете потенциально использовать FallbackValue для привязки к привязкеглобально доступный NullCommand или что-то, что всегда возвращает false для его метода CanExecute.

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" />
...