Флажки обязательны - какое решение лучше? - PullRequest
6 голосов
/ 22 сентября 2011

У меня более 20 флажков в форме wpf. Мне нужно хранить IsChecked значения из всех них в каком-то объекте.

Я знаю два пути.

1) привязать все флажки к соответствующим свойствам объекта, используя свойство зависимостей, например здесь

2) обрабатывать Clicked события всех из них

Какое решение лучше? Есть ли лучшее решение, занимающее меньше места в коде позади?

Ответы [ 4 ]

3 голосов
/ 22 сентября 2011

Обязательно используйте привязку

Если ваши флажки не связаны и повсеместно, вам потребуется 20 различных свойств зависимостей для привязки в вашем DataContext или ViewModel

Если ваши флажкивсе вместе, такие как перечисленные один за другим или в сетке, вы можете поместить их в коллекцию и связать ItemsControl с ними

<ItemsControl ItemsSource="{Binding Options}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Description}" 
                      IsChecked="{Binding IsChecked}" />
        </DataTemplate>
    </ItemsControl>
</ItemsControl>

Ваш ViewModel или DataContext будет содержать что-то вроде этого:

private List<Option> options;

private List<Option> Options
{
    get 
    {
        if (options== null)
        {
            options = new List<Option>();

            // Load Options - For example:
            options.Add(new Option { Description = "Option A", IsChecked = false });
            options.Add(new Option { Description = "Option B" });
            options.Add(new Option { Description = "Option C", IsChecked = true});
        }
        return options; 
    }
}

А ваш Option класс будет просто

public class Option
{
    public string Description { get; set; }
    public bool IsChecked { get; set; }
}
2 голосов
/ 22 сентября 2011

Binding.

Причина проста.Если вы решили подключиться к событию IsChecked, вам понадобится дополнительный код, чтобы выяснить, какое свойство к какому флажку.

В худшем случае у вас есть метод для каждого.

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

2 голосов
/ 22 сентября 2011

Если вы используете хороший MVVM-фреймворк, вы можете использовать связывание, не делая их вручную (только назовите их в соответствии с некоторыми соглашениями) - мне нравится Caliburn Micro , но есть много хороших .

1 голос
/ 22 сентября 2011

Для хранения состояния IsChecked Я бы посоветовал следовать первому (using binding), так как это лучше, потому что привязка позволяет сохранить пользовательский интерфейс и код более чистыми и отделенными. Второй (handling an event) больше всего похож на подход WinForms, поэтому я не понимаю, почему вы должны следовать ему в приложении WPF.

РЕДАКТИРОВАТЬ: Ответ на вопрос, касающийся нескольких свойств

Если зависит от того, что на самом деле связано с представлением, и как в нем отображаются флажки. Если вы используете какой-либо контейнер ItemsControl, например ListView, и каждый флажок принадлежит одной строке / столбцу - вы можете привязать все флажки к одной коллекции, например

private IList<bool> states;
public IList<bool> States
{
   get 
   {
      return this.states;
   }

   set
   {
      this.states = value;
      this.OnPropertyChanged("States");
   }
}

Чтобы дать вам конкретный ответ - поделитесь, пожалуйста, макетом пользовательского интерфейса формы, в которой установлены флажки.

...