2010-01-22 2 views
0

У меня возникли проблемы с шаблоном MVVM и командами в моем приложении WPF. Проблема заключается не столько в шаблоне MVVM, сколько в том, что происходит в моем графическом интерфейсе. Я объясню ситуацию:Как применить MVVM и команды в этой конкретной ситуации WPF?

Мое приложение может использовать DoStuff для некоторых файлов. У меня есть класс с функцией DoStuff(int limit). Мой пользователь пользовательский интерфейс имеет следующие пункты:

  • ButtonDoStuffBtn начать разбор.
  • A TextBoxLimitTxt для заполнения лимита.
  • A CheckBoxLimitChk для включения или выключения ограничения.

Когда вы "снимите флажок" LimitChk, затем LimitTxt.Text = "" и LimitTxt.IsEnabled = false. Когда вы «проверите» LimitChk, затем LimitTxt.IsEnabled = false, но текст останется пустым, пока вы не заполните что-то.

Я прочитал много руководств по командам в WPF и MVVM, но я просто не могу полить свое дело в это плесень. Пример, который я дал, на самом деле является лишь небольшой частью моего пользовательского интерфейса, но я тоже не могу это сделать.

я продолжать работать в такие вопросы, как:

  • Мне нужно два Commands для LimitChk (включения и выключения) или только один (тумблер) ли?
  • Если я привяжу int к LimitTxt, что произойдет, если я сделаю его пустым и отключит его?
  • Это чистый способ просто использовать DoStuff(Int32.Parse(LimitTxt.Text)) при нажатии DoStuffBtn?
  • Если я использую две команды на LimitChk, что происходит с функцией CanExecute() от ICommand, которая определяет, включено ли LimitChk?

Итак, главный вопрос: как бы ситуация, о которой я описал, вписывалась в хороший шаблон с использованием команд в WPF?

Некоторые ссылки на WPF, Команды и MVVM Я посмотрел на:


Wha Понимаю до сих пор, что я должен как можно больше убираться из пользовательского интерфейса. Даже такие вещи, как пользовательский интерфейс, влияют на пользовательский интерфейс. То есть снятие отметки LimitChk отключает LimitText. Тем не менее, я думаю, что я должен держать разницу между информацией и действиями, связанными с пользовательским интерфейсом, и тем, что на самом деле связано с фактической работой, которая должна быть выполнена.

+0

lol at jmorrill's tarded people like me post – kenwarner

ответ

1

Просто некоторые высокие мысли на уровне, оставляя лишние вещи, как цвет и атрибуты выравнивания, WrapPanels и т.д.

Вашего ViewModel имеет аа пару свойства:

public bool? LimitIsChecked { get; set; } 
public bool LimitTextIsEnabled { get; set; } //to be expanded, below 
public ICommand ParseCommand { get; private set; } // to be expanded, below 
public string LimitValue { get; set; } // further explanation, below 

Ваш XAML имеет CheckBox и определения TextBox что-то как:

<CheckBox Content="Limit Enabled" IsChecked="{Binding LimitIsChecked}" /> 
<TextBox Text="{Binding LimitValue}" IsEnabled="{Binding LimitIsEnabled}" /> 
<Button Content="Parse" Command="{Binding ParseCommand}" /> 

Вы хотите инициализировать ParseCommand что-то вроде этого:

this.ParseCommand = new DelegateCommand<object>(parseFile); 

Теперь давайте заполнить этот LimitTextIsEnabled собственности тоже:

public bool LimitTextIsEnabled { 
    // Explicit comparison because CheckBox.IsChecked is nullable. 
    get { return this.LimitIsChecked == true; } 
    private set { } 
} 

Ваш метод parseFile затем передать значение LimitValue собственности логики делает фактический разбор.

Я объявлял свойство LimitValue как строку здесь, чтобы избежать загромождения кода явным конвертером или другим кодом проверки. Вы можете решить, что проверка и преобразование «LimitValue является допустимым int» несколькими способами.

Конечно, я не реализовал это целиком, но хотел бы наметить шаблон, в котором вы не используете Команды, чтобы обновить состояние других виджетов. Вместо этого привяжите эти атрибуты к свойствам, которые управляются в вашей модели ViewModel.

+0

Хм интересное решение. Поэтому, если я правильно понимаю, материал в пользовательском интерфейсе, который влияет на другие элементы пользовательского интерфейса (то есть состояние флажка, влияющего на состояние текстового поля), должен проходить через модель представления. Я должен посмотреть на то, что это значит, что делегент Commommand . О, и почему свойство LimitTextIsEnabled нуждается в частном наборе? Спасибо –

+0

Да, у вас есть общая идея. LimitTextIsEnabled не * нуждается в частном наборе, но он также не нуждается в общедоступном наборе. :) 'DelegateCommand ' пришел отсюда: http://msdn.microsoft.com/en-us/library/cc707894.aspx – JMD

3

Я думаю, вы сбиты с толку ...вам не нужны никакие команды здесь, вы можете просто использовать привязки.

  • Нужно ли мне две команды для LimitChk (включение и выключение) или только один (переключатель)?

Вам не нужно. Просто создайте LimitEnabled свойство в вашем ViewModel и связать CheckBox к нему (IsChecked="{Binding LimitEnabled}")

  • Если я связать Int к LimitTxt, что произойдет, если я делаю это пустой и вывести его из строя?

Отключение от него не влияет. Если вы сделаете TextBox пустым, связывание потерпит неудачу, потому что пустая строка не может быть преобразована в междунар (по крайней мере, не с преобразователем по умолчанию)

  • ли это чистый способ просто использовать Разбор (Int32.Parse (LimitTxt.Text)) при нажатии ParseBtn?

Вам не нужно. Просто создайте свойство Limit в вашей ViewModel и привяжите его к TextBox. Возможно, вы захотите добавить ExceptionValidationRule в Binding, чтобы выделить недопустимый ввод.

Кнопка не нужна, разбор будет выполняться автоматически, когда TextBox теряет фокус (если вы используете по умолчанию UpdateSourceTrigger). Если вы хотите настроить способ анализа, вы можете создать собственный конвертер для использования в привязке.

+0

О предельном разрешении, это не просто свойство, которое нужно установить, но некоторые вещи в пользовательском интерфейсе должны измениться, когда я проверяю LimitChk. Или я должен сделать слушателя свойств для этого, когда LimitEnabled изменится? Возможно, это была не лучшая идея для меня выбрать «Парс» как вещь для кнопки, а также говорить об int32.Parse. Парсинг на кнопке - это фактически какой-то другой Parse. Я заменю его на DoStuff. –

Смежные вопросы