2016-07-17 3 views
0

Я хочу создать свойствоgrid с помощью xaml. PropertyGrid из Extended WPF Toolkit не имеет autoupdate, tooltips и т. Д., Поэтому я решил создать свой собственный.Добавить элементы управления динамически с помощью mvvm

Моя идея - создать ObservableCollection элементов управления и добавить их динамически в ListBox (или ListView).

Это пример проект «testy_wpf»:

Чтобы использовать привязку данных создать OnPropertyChanged класса

namespace testy_wpf 
{ 
    public class NotifyPropertyChanged : INotifyPropertyChanged 
    { 
     public NotifyPropertyChanged() 
     { 

     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(String Name) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(Name)); 
      } 
     } 
    } 
} 

Тогда я наследовать этот класс в своем классе Test, с некоторыми свойствами (только для тестов)

namespace testy_wpf 
{ 
    public class Test : NotifyPropertyChanged 
    { 
     public Test() 
     { 
     } 

     private int val { get; set; } 
     public int Val 
     { 
      get { return val; } 
      set 
      { 
       val = value; 
       OnPropertyChanged("Val"); 
      } 
     } 

     private String name { get; set; } 
     public String Name 
     { 
      get { return name; } 
      set 
      { 
        name = value; 
        OnPropertyChanged("Name"); 
      } 
     } 

     private String errorMsg { get; set; } 
     public String ErrorMsg 
     { 
      get {return errorMsg; } 
      set 
      { 
       errorMsg = value; 
       OnPropertyChanged("ErrorMsg"); 
      } 
     } 

     public Control Control { get; set; } 
    } 
} 

Затем я создаю класс MainWindowViewModel

public class MainWindowViewModel 
    { 
     public MainWindowViewModel() 
     { 
      T = new ObservableCollection<Test>() 
      { 
       new Test(){ Name = "Object 1" , Val = 1, Control = new TextBox(){ Text = "Test"}, ErrorMsg = "Error 1"}, 
       new Test(){ Name = "Object 2" , Val = 2, Control = new ComboBox(), ErrorMsg = "Error 2"}, 
       new Test(){ Name = "Object 3" , Val = 2, Control = new CheckBox(), ErrorMsg = "Error 3"} 
      }; 
     } 

     public ObservableCollection<Test> T { get; set; } 
    }; 

который я добавить в MainWindow вид:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = new MainWindowViewModel(); 
     } 
    } 

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

<Window.Resources> 
    <DataTemplate x:Key="ControlTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Name}" Width="100"/> 
      <TextBox Text="{Binding Path=Val,Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}" Width="50"> 
       <TextBox.ToolTip> 
        <StackPanel> 
         <TextBlock Text="{Binding ErrorMsg}" /> 
        </StackPanel> 
       </TextBox.ToolTip> 
      </TextBox>    
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

<ListBox Width="200" 
      HorizontalAlignment="Left" 
      Margin="10" 
      ItemTemplate="{StaticResource ControlTemplate}" 
      ItemsSource="{Binding Path=T}" /> 

Моя идея заключается в том, чтобы использовать некоторые Contorl containter связать «Т» (Т имя ObservableCollection из ViewModel) управления имуществом с некоторыми containter в XAML.

Что-то вроде этого

//Pseudo code 
<control data="{Binding Control}" /> <!-- Where control is i.e. Textbox, ComboBox, CheckBox--> 

В результате я должен иметь, как много элементов управления, отображаемых как длина T массива (в настоящее время я создаю TextBoxes). Позже я просто перечислил все свойства someclass для отображения полей свойстваgrid.

Мой вопрос в том, какой контейнер XAML может хранить все типы элементов управления? И как связать его с некоторым контролем в массиве T.

Были похожие темы, но люди создают только один тип элементов управления, то есть текстовое поле. И я знаю, как отображать много текстовых полей.

ответ

0

Посмотрите на DataTemplateSelector. Вы можете предоставить свой собственный селектор шаблонов, который вернет определенный DataTemplate в ваш ListBox (установите свой собственный селектор шаблонов в свойство ItemTemplateSelector в списке).

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