从XAML设置ViewModel的属性
我有一些UserControl
,它的DataContext
绑定到ViewModel,如何从XAML
设置ViewModel的属性? 可能吗?
UPD:很抱歉不太清楚,我试图得到这样的东西:UserControl的DataContext绑定到ViewModel,我需要将ViewModel的属性设置为某些东西(比方说,UserControl的Width属性)。 可能吗?
UPD2:似乎不可能。我知道关于TwoWay绑定模式等等,我想做的事情 – 将ViewModel的属性设置为UserControl的一个
这个例子应该非常清楚
绑定有两种方式:即从源(例如视图模型)到目标(例如用户控件)和从目标返回到源。
您可以通过绑定模式指定方向。
以下是BindingModes :
- 双向
- 单程
- 一度
- OneWayToSource
在您的情况下,如果要将usercontrol的width属性绑定到ViewModel的TheWidth属性:
案例A:
想要双向绑定,请使用Mode = TwoWay
案例B:
想要仅从usercontrol绑定到viewmodel,请使用Mode = OneWayToSource
我不确定我是否完全理解这个问题。
但这是一个例子。 它会:
-
通过在xaml中设置用户控件
DataContext
属性,在用户控件内创建类型为ExampleViewModel
的视图模型 -
在xaml中创建一个文本框并将其绑定到视图模型
TextInViewModel
字符串属性。 -
设置通常的
INotifyPropertyChanged
接口(这被提取到基类ViewModelBase
)
在xaml中创建视图模型并将用户控件数据上下文设置为:
视图模型:
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 { /// /// Property bound to textbox in xaml. /// public String TextInViewModel { get { return _textInViewModel; } set { _textInViewModel= value; RaisePropertyChanged("TextInViewModel"); } } private string _textInViewModel; /// /// Constructor. /// public ExampleViewModel() { } }
XAML
我更喜欢ViewModel Locator方法(这就像viewModel的服务定位器pattorn)。 因为你的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
好吧,你将UI元素绑定到它们:
假设这样的视图模型:
class ViewModel { public string MyProperty { get; set; } public int DisplayWidth { get; set; } }
通过绑定我亲爱的朋友..
例如:(假设在您的上下文中)
如果您有“Person”类,并且您的人员具有Name和SurName公共属性,并且您希望将其绑定到文本框。 您执行以下操作:
这仅在名称是您的公共属性时才有效,最佳做法是将对象(在本例中为Person)作为公共属性并以不同方式使用Path参数。
例:
它会减少您的代码混乱,然后在viewmodel中为viewmodel中的任何对象的每个属性创建一个属性。
“如何从XAML设置ViewModel的属性?是否可能?”
所以,这似乎是不可能的,你可以完成最大限度 – 双向绑定,不幸的是,这不是我想要的。 总而言之,设计相当糟糕而不是问题