设置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}>
我不确定我是否完全理解这个问题。
但这里有一个例子。它将:
-
通过设置用户,在用户控件内创建
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的属性?有可能吗?">
所以,这似乎是不可能的,你可以实现的最大值-双向绑定,不幸的是,这不是我想要的。总而言之,这是一个相当糟糕的设计,而不是一个问题