Я хочу создать свойство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.
Были похожие темы, но люди создают только один тип элементов управления, то есть текстовое поле. И я знаю, как отображать много текстовых полей.