2010-09-16 2 views
3

У меня есть простой класс, который предоставляет государственные коды, как это:Двухсторонних связать выпадающий с простым строковым массивом

public class StateProvider 
{ 
    static string[] _codes = new string[] 
    { 
     "AL", 
     "AK", 
     ... 
    }; 

    public string[] GetAll() 
    { 
     return _codes; 
    } 
} 

Моего класс модели, который поддерживает мнение выглядит немного как это:

public class ProjectModel : ChangeNotifier 
{ 
    StateProvider _states = new StateProvider(); 

    public ProjectModel() 
    { 
     Project = LoadProject(); 
    } 

    ProjectEntity _project; 
    public ProjectEntity Project 
    { 
     get { return _project; } 

     set 
     { 
      _project = value; 
      FirePropertyChanged("Project"); 
     } 
    } 

    public string[] States { get { return _states.GetAll(); } } 
} 

И мой ComboBox XAML выглядит следующим образом:

<ComboBox SelectedValue="{Binding Project.State, Mode=TwoWay}" SelectedValuePath="{Binding RelativeSource={RelativeSource Self}}" ItemsSource="{Binding States}" /> 

связывания работы из пользовательского интерфейса в сущности - если выбрать стат e из комбо, тогда значение передается объекту проекта, и я могу его сохранить. Однако, если я выключился и перезагрузился, значение кода состояния не привязывается от объекта к пользовательскому интерфейсу, а комбо ничего не отображает. Затем, конечно, последующее сохранение возвращает значение состояния объекта.

Я хочу, чтобы это было очень просто, так как я хочу отображать коды состояний и сохранять коды состояний (я не хочу отображать полное имя состояния). Поэтому я не хочу, чтобы я пытался создать класс State, обладающий свойствами Code и FullName, и избегать использования свойств SelectedValuePath и DisplayMemberPath в combobox.

Редактировать: Добавлен код, в котором ProjectModel изменяет уведомление. Обратите внимание, что класс ProjectEntity делает это тоже. Поверь мне это работает. Я оставил его, потому что он также наследуется от базового класса Entity, который меняет уведомление посредством отражения. Связывание TwoWay работает над всем, но для combobox.

+0

Где свойство PropertyChangeNotification? –

+0

Свойство PropertyChangeNotification реализовано в базовом классе. Я не включил абсолютно все для краткости. Я сделаю это немного яснее. – xanadont

ответ

1

Вау, whodathought было бы прийти к этому:

<ComboBox ItemsSource="{Binding States}" SelectedValue="{Binding Project.State, Mode=TwoWay}" /> 

Оказалось, это был порядок, в котором я поместил атрибуты в XAML. Связывание SelectedValue происходило до привязки ItemsSource, и, таким образом, в поле со списком не было элементов, когда был привязан SelectedValue.

Вау, это просто кажется очень плохой вещью.

1

Вы должны по крайней мере реализовать IPropertyNotifyChanged на вашем ProjectModel класса

public class ProjectModel : INotifyPropertyChanged 
{ 
     public event PropertyChangedEventHandler PropertyChanged; 

и реализовать свойство проекта, как показано ниже для связывания с работы, кроме 1-полосная-1-времени.

public ProjectEntity Project 
{ 
    get { return (ProjectEntity)GetValue(ProjectProperty); } 
    set { SetValue(ProjectProperty, value); } 
} 

// Using a DependencyProperty as the backing store for Project. 
// This enables animation, styling, binding, etc... 
public static readonly DependencyProperty ProjectProperty = 
    DependencyProperty.Register("Project", 
           typeof(ProjectEntity), 
           typeof(ProjectModel), 
           new PropertyMetadata(null, 
            new PropertyChangedCallback(OnProjectChanged))); 

static void OnProjectChanged(object sender, DependencyPropertyChangedEventArgs args) 
{ 
    // If you need to handle changes 
} 
+0

Во-первых, я уверен, что это не зависит от уведомления об изменении свойства, потому что класс Project увлажнен до того, как представление даже начнет загружаться. Во-вторых, как модель представления, так и класс проекта уже реализуют INotifyPropertyChanged (приведенный выше код сокращен). Кроме того, ВСЕ другие свойства моего класса Project - это привязка TwoWay. Это просто глупое комбо. – xanadont

+1

К сожалению, мы можем работать только с тем, что мы показываем. Если вы сократите код, вы должны дать людям хедз-ап, чтобы избежать траты времени. Благодарю. –

+0

Поправил вопрос. Проверьте примечание «Изменить:». – xanadont

0

Измените класс ProjectModel к этому:

public class ProjectModel : ChangeNotifier 
{ 
    StateProvider _states = new StateProvider(); 

    public ProjectModel() 
    { 
     Project = LoadProject(); 

     States = new ObservableCollection<string>(_states.GetAll()); 
    } 

    ProjectEntity _project; 
    public ProjectEntity Project 
    { 
     get { return _project; } 

     set 
     { 
      _project = value; 
      FirePropertyChanged("Project"); 
     } 
    } 

    public ObservableCollection<string> States { get; set; } 
} 

Кроме того, убедитесь, что ProjectEntity также реализует INotifyPropertyChanged.

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