设置ViewModel';s XAML中的属性

本文关键字:XAML 属性 ViewModel 设置 | 更新日期: 2023-09-27 17:53:34

我有一些UserControl,它的DataContext绑定到ViewModel,如何从XAML设置ViewModel的属性?有可能吗?

UPD:抱歉不太清楚,我正试图得到这样的东西:UserControl的DataContext绑定到ViewModel,我需要将ViewModel的属性设置为某个值(比如说,UserControl的Width属性(。有可能吗?

乌干达人民国防军2:这似乎是不可能的。我知道TwoWay绑定模式等,我想做的事情是将ViewModel的属性设置为UserControl的一个

这个例子应该很清楚

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

设置ViewModel';s XAML中的属性

我不确定我是否完全理解这个问题。

但这里有一个例子。它将:

  • 通过设置用户,在用户控件内创建ExampleViewModel类型的视图模型控制xaml 中的DataContext属性

  • 在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()
    {
    }
}

绑定有两种方式:即从源(例如viewmodel(到目标(例如usercontrol(,以及从目标返回到源。
您可以通过绑定模式指定方向。

以下是绑定模式:

  • 双向
  • 单向
  • OneTime
  • OneWayToSource

在您的情况下,如果您想将usercontrol的width属性绑定到ViewModel:的TheWidth属性

案例A:
想要双向绑定,请使用模式=双向

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

情况B:
只想从用户控件绑定到视图模型,请使用Mode=OneWayToSource

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

XAML

   <UserControl.DataContext>
        <vm:ViewModel/>
    </UserControl.DataContext>

我更喜欢ViewModel定位器方法(这就像ViewModel的服务定位器模式(。因为一旦您的ViewModel具有构造函数参数,您要么是紧密耦合的,要么就不能使用上面描述的xaml方式。。。。

有许多ViewModel定位器方法。其中一个是使用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

好吧,您可以将UI元素绑定到它们:

<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; }
}

通过绑定我亲爱的朋友。。

例如:(假设在您的上下文中(

如果您有类"Person",并且您的人员具有Name和SurName公共属性,并且您希望将其绑定到文本框。您可以执行以下操作:

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

这只适用于名称是公共属性的情况,最好将对象(在本例中为Person(作为公共属性,并以不同的方式使用Path参数。

示例:

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

它确实可以减少代码的混乱,然后在视图模型中为视图模型中任何对象的每个属性创建一个属性。

"如何从XAML设置ViewModel的属性?有可能吗?">

所以,这似乎是不可能的,你可以实现的最大值-双向绑定,不幸的是,这不是我想要的。总而言之,这是一个相当糟糕的设计,而不是一个问题