Привязка различных свойств из ViewModel в зависимости от использования триггеров - PullRequest
0 голосов
/ 05 сентября 2011

Я пытаюсь достичь простой вещи, или я думаю, что это просто, но я не знаю, возможно ли это ...

Представьте себе следующий сценарий ... В ViewModel у меня есть одно свойство с именем SelectedProduct и другое с именем NewProduct (оба одинакового типа, модель).

В моем главном окне у нас есть ListView и две кнопки, одна из которых - кнопка Добавить, а другая - кнопка Обновить (и эта обновит Выбранный элемент в ListView), и обе откроют одно и то же окно, но сделают разные вещи.

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

Таким образом, если мы нажмем кнопку «Добавить», элементы управления (TextBoxes и ComboBoxes) во втором окне будут связывать свойство NewProduct, а если мы нажмем кнопку «Обновить», второе окно будет связывать свойство SelectedProduct.

Есть ли способ достичь этого?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011

Почему бы вам просто не создать одно свойство EditedProduct и присвоить ему соответствующее значение?

0 голосов
/ 05 сентября 2011

Посмотрите на следующую модель представления.

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

ВВ следующем коде я создал отредактированное свойство (Привязано к просмотру) и назначил ему Newproduct при выполнении команды добавления кнопки и назначил SelectedProduct при обновлении ..

 class Viewmodel : ViewModelBase
    {

        private void AddCommandExecute(object o)
        {
            // your logic
            EditedProduct = NewProduct;
        }

        private void UpdateCommandExecute(object o)
        {
            // your logic
            EditedProduct = SelectedProduct;
        }


        private Product _selectedProduct;

        public Product SelectedProduct
        {
            get { return _selectedProduct; }
            set
            {
                _selectedProduct = value;
                OnPropertyChanged("SelectedProduct");
            }
        }

        private Product _newProduct;

        public Product NewProduct
        {
            get { return _newProduct; }
            set
            {
                _newProduct = value;
                OnPropertyChanged("NewProduct");
            }
        }

        private Product _editedProduct;

        public Product EditedProduct
        {
            get { return _editedProduct; }
            set
            {
                _editedProduct = value;
                OnPropertyChanged("EditedProduct");
            }
        }

    }
0 голосов
/ 05 сентября 2011

Я вижу, что два метода, которые будут работать для этого сценария, будут использовать две разные команды, как вы заявили, каждый из которых будет вызывать Window по-своему.

Первый вариант будет состоять в том, чтобы создать либо два конструктора для Window (один для добавления, а другой для обновления) , либо просто создать тот, который передается в значение enum в качестве параметра.

public void Window2(DisplayMode mode)

Где DisplayMode - это enum с двумя значениями (Add и Update)

или

public void Window2() // The default 'Add' window
{
}

public void Window2(ModelObject instance) // The 'Update' window
{
}

Второй вариант должен был бы сделать конструктор для Window private и создать статические методы в классе, чтобы создать экземпляр Window и отобразить его для пользователя.

Это можно использовать как

Window2.UpdateItem(selectedItem)

Каждый из этих методов устанавливает DataContext для экземпляра окна на объект, который вы хотите отредактировать (либо на новый экземпляр объекта, либо на экземпляр, который был передан конструктору)

...