Установка свойства ViewModel из XAML - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть некоторые UserControl, это DataContext привязано к ViewModel, Как установить свойство ViewModel из XAML?Возможно ли это?

UPD: извините за то, что не очень ясно, я пытаюсь получить что-то вроде этого: DataContext UserControl привязан к ViewModel, мне нужно установить свойство ViewModel в что-то (скажем, Width UserControlимущество).Возможно ли это?

UPD2: Кажется, что это невозможно. Я знаю о режиме привязки TwoWay и т. Д., Что я хотел сделать - установить для свойства ViewModel значение UserControl

Этот пример долженбыть очень ясным

<Set Property={Binding SomePropertyOnViewModel} 
     Value={Binding RelativeSource={RelativeSource Self}, 
                    Path=SomePropertyOnUserControl}>

Ответы [ 7 ]

3 голосов
/ 29 апреля 2011

Привязка работает в обоих направлениях: от источника (например, viewmodel) к цели (например, usercontrol) и от цели обратно к источнику.
Вы указываете направление через Режим привязки.

Ниже приведены BindingModes :

  • TwoWay
  • OneWay
  • одноразовая
  • OneWayToSource

В вашем случае, если вы хотите привязать свойство width usercontrol к свойству TheWidth ViewModel:

Дело A:
Хотите связать в обоих направлениях, используйте Mode = TwoWay

<UserControl Width="{Binding TheWidth, Mode=TwoWay}">
<!-- your rest of code -->
</UserControl>

Дело B:
Хотите привязать только из usercontrol к viewmodel, используйте Mode = OneWayToSource

<UserControl Width="{Binding TheWidth, Mode=OneWayToSource}">
<!-- your rest of code -->
</UserControl>
3 голосов
/ 23 июля 2015

Я не уверен, правильно ли я понимаю вопрос.

Но вот пример.Это будет:

  • Создать модель представления типа ExampleViewModel внутри пользовательского элемента управления, установив свойство DataContext пользовательских элементов управления в xaml

  • Создайте текстовое поле в xaml и привяжите его к представлению моделей TextInViewModel строковое свойство.

  • Настройте обычный интерфейс INotifyPropertyChanged (это было извлечено в базовый класс ViewModelBase)

Создайте модель представления в xaml и установите для нее контекст данных пользовательских элементов управления:

<UserControl x:Class="MyUserControl"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Test" 
            xmlns:viewModel="clr-namespace:ViewModels"> 
        <UserControl.DataContext>
            <viewModel:ExampleViewModel/>
        </UserControl.DataContext>

        <StackPanel Orientation="Horizontal" >
            <Label>Enter Text here: </Label>
            <TextBox Text="{Binding TextInViewModel}"></TextBox>
        </StackPanel>
</UserControl>

ViewModel:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }

}


public class ExampleViewModel : ViewModelBase 
{
    /// <summary>
    /// Property bound to textbox in xaml.
    /// </summary>
    public String TextInViewModel
    {
        get { return _textInViewModel; }
        set
        {
            _textInViewModel= value;
            RaisePropertyChanged("TextInViewModel");
        }
    }
    private string _textInViewModel;

    /// <summary>
    /// Constructor.
    /// </summary>
    public ExampleViewModel()
    {

    }
}
1 голос
/ 29 апреля 2011

Я предпочитаю подход локатора ViewModel (это похоже на паттерн сервисного локатора для viewModels). Потому что, как только вы используете параметры конструктора Hast ViewModel, вы либо будете титулованно связаны, либо не сможете использовать описанный выше способ xaml ....

Существует множество способов ViewModel-Locator, которые описаны здесь с использованием MEF и silverlight. http://johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum

вот еще один: http://brendan.enrick.com/post/Wire-up-your-ViewModels-using-a-Service-Locator.aspx

1 голос
/ 29 апреля 2011

XAML

   <UserControl.DataContext>
        <vm:ViewModel/>
    </UserControl.DataContext>
0 голосов
/ 01 апреля 2013

"Как установить свойство ViewModel из XAML? Возможно ли это?"

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

0 голосов
/ 29 апреля 2011

Ну, вы связываете свои элементы пользовательского интерфейса с ними:

<UserControl Width="{Binding Path=DisplayWidth, Mode=OneWayToSource}">
    <Grid>
        <TextBox MinWidth=100 Text="{Binding MyProperty}"/>
    </Grid>
</UserControl>

при условии, что модель вида выглядит следующим образом:

class ViewModel
{
    public string MyProperty { get; set; }
    public int DisplayWidth { get; set; }
}
0 голосов
/ 29 апреля 2011

Через связывание мой дорогой друг ..

например: (при условии, что в вашем контексте)

Если у вас есть класс «Person», и у вашего лица есть публичное свойство Name и SurName, и вы хотите связать его с текстовым полем. Вы делаете следующее:

<TextBox Text="{Binding Path=Name}" />

Это работает только в том случае, если имя является вашим общедоступным свойством, поэтому рекомендуется сделать объект (в данном случае Person) публичным и использовать параметр Path по-другому.

Пример:

<TextBox Text="{Binding Path=Person.Name}" />

Это намного меньше загромождает ваш код, чем создание свойства в вашей view-модели для каждого свойства любого объекта в вашей view-модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...