2014-01-06 5 views
2

Я отправил предыдущий вопрос, но не было никакой помощи, поэтому я попытался начать его кодирование и еще раз взглянуть на него, и я застрял на некотором коде. Я пытаюсь следовать MVVMСоздание текстовых полей?

Я создал класс с именем Standard который выглядит следующим образом:

namespace MVVModel 
{ 
    public class Standard 
    { 

     string _title; 
     string _question; 



     public string Title 
     { 
      get { return _title; } 
      set { _title = value; } 
     } 

     public string Question 
     { 
      get { return _question; } 
      set { _question = value; } 
     } 
    } 
} 

Затем я создал ViewModel класс, который выглядит следующим образом:

namespace MVVModel 
{ 
    class ViewModel 
    { 

     ObservableCollection<Standard> _title = new ObservableCollection<Standard>(); 
     ObservableCollection<Standard> _question = new ObservableCollection<Standard>(); 

    public ViewModel() 
    { 

    } 

    public ObservableCollection<Standard> Title 
    { 
      get 
      { 
       return _title; 
      } 
      set 
      { 
       _title = value; 
      } 
    } 

    public ObservableCollection<Standard> Question 
    { 
      get 
      { 
       return _question; 
      } 
      set 
      { 
       _question = value; 
      } 
    } 
    } 
} 

Это мой XAML:

<Grid> 

    <Button x:Name="btnTitle" Content="Title" HorizontalAlignment="Left" Margin="691,22,0,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="btnQuestion" Content="Question" HorizontalAlignment="Left" Margin="797,22,0,0" VerticalAlignment="Top" Width="75" Command="{Binding AddTitle}"/> 

     <ItemsControl ItemsSource="{Binding Question}" Margin="0,86,0,0"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBox /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

</Grid> 

Я просто хочу создать текстовое поле динамически, но ничего не показываю, никакой помощи?

+1

Вы должны сначала принять предыдущий ответ, если он вам помог. –

+1

Сколько вопросов содержится в вашем списке? Если вы не ввели ни одного, текстового поля не будет. – nvoigt

+0

Вам необходимо реализовать интерфейс ['INotifyPropertyChanged'] (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) на ваших классах. Тем не менее, вы действительно не должны добавлять повторяющиеся вопросы ... вместо этого вы должны отредактировать исходный вопрос. – Sheridan

ответ

1

я упомянул в моем предыдущем ответе о внедрение INotifyPropertyChanged.

Зачем вам снова нужна коллекция вопросов и титров в вашем представленииModel, это уже существует в классе Standard.

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

Вот реализация для INotifyPropertyChanged

public class Standard : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Create the OnPropertyChanged method to raise the event 
     protected void NotifyOfPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 

     protected void NotifyOfPropertyChanged<TProperty>(Expression<Func<TProperty> property) 
     { 
      NotifyOfPropertyChanged(property.GetMemberInfo().Name); 
     } 

    string _title; 
    ObservableCollection<string> _questions;   

    public string Title 
    { 
     get { return _title; } 
     set { 
      _title = value; 
      NotifyOfPropertyChanged(()=>Title); 
     } 
    } 

    public ObservableCollection<string> Questions 
    { 
     get { return _questions; } 
     set { 
      _questions = value; 
      NotifyOfPropertyChanged(()=>Questions); 
     } 
    } 
} 
+0

Я просмотрел ваш предыдущий ответ. Он говорит, что для 'NofityPropertyChanged' требуется пространство имен? также XAML говорит, что 'Text' уже определен? – user3157821

+0

Вам необходимо реализовать интерфейс INotifyPropertyChanged. Хорошо, позвольте мне сделать –

+0

Спасибо за редактирование 'protected void NotifyOfPropertyChanged (выражение > свойство)' '' TProperty' имеет ошибку, говорящую «Не удалось найти». Также в том же методе 'property.GetMemberInfo'' GetMemberInfo' говорит 'System.Linq.Expressions не содержит определения для GetMemberInfo' Наконец, лямбда-выражения не конвертируются в строку. – user3157821

0

Для выполнения этой задачи вы должны выполнить несколько шагов.

  1. Прежде всего, необходимо связать коллекцию Standard к Grid, вместо Question.

  2. Во-вторых, вам нужно связать свойство предыдущего класса с текстовым полем.

Ex:

<DataTemplate> 
    <TextBox Text="{Binding Question"} /> 
</DataTemplate> 

Edit:

Я хотел бы упомянуть эту статью, чтобы помочь вам:

http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

+0

Во-первых, когда я привязываю 'Standard' к' Grid', какое свойство я делаю с помощью '' и '' не работает. Во-вторых, я получаю сообщение об ошибке с вашей частью кода 'Вопрос не поддерживается в проекте WPF' – user3157821

+0

Вам не нужна команда. Я приложил Quick Tutorial, чтобы помочь вам. Я думаю, что вам лучше следовать полному руководству и получить некоторый опыт вместо простого вопроса/ответа. – gustavodidomenico

+0

Я просмотрел учебник и загрузил его, чтобы посмотреть, как он работает, и теперь я понимаю его немного лучше. В «ViewModel» он будет отличаться от моего, поскольку я просто хочу создать «текстовое поле», что бы я добавил сюда? – user3157821

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