2015-05-13 3 views
0

Я в основном использую код this, и я успешно добавляю CheckBox es (вместо ComboBox, который приведен в примере) к моему View. Однако проблема заключается в том, что я хочу иметь возможность настраивать (разные Content, переплет и т. Д.) Те CheckBox es. Прямо сейчас, когда я добавляю CheckBox, он добавляет значение по умолчанию, которое определено в моем DataTemplate.Как добавить пользовательские элементы управления в WPF с использованием MVVM и DataTemplate?

DataTemplate:

<DataTemplate DataType="{x:Type local:CurrencyViewModel}"> 
    <StackPanel Orientation="Vertical"> 
     <CheckBox Content="Default"/> 
    </StackPanel> 
</DataTemplate> 

CurrencyViewModel - код здесь не используется программой, и я не знаю, почему, но я уверен, что это проблема

class CurrencyViewModel : INotifyPropertyChanged 
{ 
    public CurrencyViewModel(ICurrency currency) 
    { 
     CheckBox currencyCheckBox = new CheckBox() 
     { 
      Content = currency.Name, 
     }; 
    OnPropertyChanged("CurrenciesList"); 
} 

MainViewModel:

public MainViewModel() 
{ 
    foreach (ICurrency currencyin GetAllCurrencies()) 
    { 
     CurrenciesList.Add(new CurrencyViewModel(currency)); 
    } 
} 

private ObservableCollection<CurrencyViewModel> _CurrenciesList = new ObservableCollection<CurrencyViewModel>(); 
public ObservableCollection<CurrencyViewModel> CurrenciesList 
{ 
    get 
    { return _CurrenciesList; } 
    set 
    { 
     _CurrenciesList = value; 
     OnPropertyChanged("CurrenciesList"); 
    } 
} 
+2

Наличие CheckBox в ViewModel вызывает некоторые звуковые сигналы ... – goobering

+0

@goobering жесткого кодирования их не может быть и речи. Есть ли лучший подход, чем этот? –

+1

Для начала избавитесь от CheckBox в вашей виртуальной машине. Вы должны хранить только имя как строку в вашем CurrencyViewModel. Затем установите свойство Content CheckBox в DataTemplate в {Binding Name}. – goobering

ответ

1

Вы не должны размещать View объектов в своем ViewModel - это нарушает намерение шаблона (отделение бизнес-логики от презентации). Checkbox/Combobox выбор должен быть сделан в View на основе состояния, типа или данных, содержащихся в вашей ViewModel через Binding, DataTemplates, Triggers и т.д.

Я бы переоценивать свой дизайн, как это не совместимо с MVVM как шаблон.

+0

Но мне нужно динамически создавать контроллеры, а затем ссылки в моей первой строке говорят, что подход, который я принял, является лучшим. Это не правильно? Должен ли я создавать все в коде позади, потому что мне нужна какая-то бизнес-логика для получения информации для каждой «CheckBox»? –

+2

Разница между вашим дизайном и связанным решением заключается в том, что связанное решение содержит только свойства для привязки к элементам * * * * интерфейса. – goobering

+0

Является ли расположение каждого элемента одинаковым? т. е. 'Checkbox' с названием валюты? Если это так, вам просто нужно установить привязку в «Checkbox» в «View» XAML и выставить имя валюты через свойство в «ViewModel», с которым вы связываетесь. – toadflakz

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