Динамическое добавление элементов управления в WPF MVVM

Я относительно новичок в MVVM и WPF, я просто хочу кивнуть в правильном направлении.

Я работаю над динамическим поисковым представлением, в котором при нажатии кнопки следует добавить новую строку, содержащую 3 поля со списком и 2 текстовых поля. Как мне это сделать? Благодарю.

Ответы

Ответ 1

Если вы действительно хотите сделать mvvm, попробуйте забыть "как я могу добавить элементы управления". вам не нужно, просто подумайте о своих моделях просмотра - WPF создаст для вас контуры:)

в вашем случае позволяет сказать, что у нас есть SearchViewModel и SearchEntryViewmodel.

public class SearchEntryViewmodel
{
    //Properties for Binding to Combobox and Textbox goes here
}


public class SearchViewModel 
{
    public ObservableCollection<SearchEntryViewmodel> MySearchItems {get;set;}
    public ICommand AddSearchItem {get;}
}

до сих пор вам не нужно думать о usercontrols/view. в вашем SearchView вы создаете элемент ItemsControl и привязываете ItemSource к MySearchItems.

<ItemsControl ItemsSource="{Binding MySearchItems}"/> 

теперь вы видите все свои модели SearchEntryView в ItemsControl (просто atString() atm).

Чтобы соответствовать вашим требованиям, чтобы показать каждую модель SearchEntryView с помощью 3Combobox и т.д., вам просто нужно определить DataTemplate в своих ресурсах.

<DataTemplate DataType="{x:Type local:SearchEntryViewmodel}">
    <StackPanel Orientation="Horizontal">
        <Combobox ItemsSource="{Binding MyPropertyInSearchEntryViewmodel}"/>
        <!-- the other controls with bindings -->
    </StackPanel>
</DataTemplate>

thats all:), и вам никогда не придется думать о том, как я могу добавлять элементы управления динамически. вам просто нужно добавить новый SearchEntryViewmodel в свою коллекцию.

этот подход называется Viewmodel First, и я думаю, что это самый простой способ сделать MVVM.

Ответ 2

Если вы новичок в MVVM и WPF, есть действительно замечательный видеоурок о том, как архитектор приложения С#/WPF/MVVM Джейсона Доллингера, который доступен здесь в lab49. Весь исходный код, который он развивает в этом потрясающем видео, также доступен прямо здесь, в lab49.

После просмотра, у вас не возникнет проблем с поиском вашего поиска.

Ответ 3

Один из вариантов заключается в том, что вы можете создавать TextBoxes и comboboxes в backend, создавая новый instanse. Но лучшим вариантом является то, что вы можете создать один usercontrol, который содержит все тексбокс и combobox, которые вы хотите добавить, и в каком формате вы хотите. После создания при нажатии кнопки вы можете создать instace этого usercontrol и установить его в сетке или любом другом элементе управления с помощью свойства SetValue элемента управления.

Если вы новичок в WPF и MVVM, прочитайте эти блоги, чтобы понять это.

https://radhikakhacharia.wordpress.com/2012/06/01/wpf-tutorial-3/

https://radhikakhacharia.wordpress.com/2012/02/13/model-view-viewmodel/