2016-08-11 3 views
0

Я создал проект с моделью MVVM и сделал это с помощью подхода вида-первого.Управление представлением в MVVM

У меня есть TextBox в моем XAML коде, наряду с Button, чтобы передать данные из TextBox:

<!-- View - XAML code --> 
<TextBox 
    MinWidth="30" 
    Name="TagId"/> 

<Button 
    Command="{Binding AddTagCommand}" 
    CommandParameter="{Binding Text, ElementName=TagId}" 
    Content="Add"/> 

Когда я нажимаю кнопку, я хочу TextBox очищено. Согласно Prism manual:

В некоторых случаях код-позади может содержать UI логического кода, который реализует визуальное поведение, которое трудно или неэффективно выразить в Extensible Application Markup Language (XAML), такие как сложные анимации, или когда код должен непосредственно манипулировать визуальными элементами, которые являются частью представления.

Вот код позади и модель.

//View - code behind 
public partial class ApplicationStarterView : UserControl 
{ 
    public ApplicationStarterView() 
    { 
    } 

    public ApplicationStarterView(ApplicationStarterViewModel viewModel) : this() 
    { 
     DataContext = viewModel; 
     InitializeComponent(); 
    } 
} 

//View model 
public class ApplicationStarterViewModel : BindableBase 
{ 
    private readonly IUnityContainer _container; 

    public ApplicationStarterViewModel(IUnityContainer container) 
    { 
     _container = container; 
     AddTagCommand = new DelegateCommand<object>(AddTag); 
    } 

    public ICommand AddTagCommand { get; private set; } 

    private void AddTag(object input) 
    { 
     //Forward stuff 
     //Clear TextBox 
    } 
} 

Могу ли я каким-либо образом сжать в какой-то код, чтобы сделать TagId.Clear()?

ответ

4

Я бы привязал текст к другому свойству модели просмотра.

Таким образом, вы можете пропустить параметр команды и AddTagCommand можно сразу прочитать новое Text свойства, сделать его добавление вещи, а затем очистить его, таким образом, обновление TagId.

Полностью несвязанный совет: практически не рекомендуется вводить IUnityContainer ... если вам нужно создать материал, используйте заводы.

+0

Имущество для '' Text'' звучит как путь. Что мне делать с UnityContainer? Мне нужно иметь доступ к нему как-то ... –

+0

Для чего это нужно? Если вам нужно это сделать 'Container.Resolve ()', скорее добавьте 'IMyTagFactory', который имеет метод CreateTag. – Haukinger

+0

Это шаблон, на который вы ссылаетесь, исправить: http://www.dofactory.com/net/factory-method-design-pattern. Мне нужен контейнер, чтобы получить все мои разные намерения в модели. Поскольку я делаю это во-первых, представление создает модель представления, которая создает модель, которая делает вещи для меня. Возможно, я неправильно понял, как использовать контейнер ... –

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