![](/img/trans.png)
[英]Binding MedialElement from the view (xaml) to a ViewModel's property
[英]Setting ViewModel's Property from XAML
我有一些UserControl
,它的DataContext
綁定到 ViewModel,如何從XAML
設置 ViewModel 的屬性? 可能嗎?
UPD:抱歉不是很清楚,我試圖得到這樣的東西:UserControl 的 DataContext 綁定到 ViewModel,我需要將 ViewModel 的屬性設置為某些東西(比如說,UserControl 的 Width 屬性)。 可能嗎?
UPD2:似乎不可能。我知道 TwoWay 綁定模式等,我想做的事情 - 將 ViewModel 的屬性設置為 UserControl 的
這個例子應該很清楚
<Set Property={Binding SomePropertyOnViewModel}
Value={Binding RelativeSource={RelativeSource Self},
Path=SomePropertyOnUserControl}>
我不確定我是否完全理解這個問題。
但這里有一個例子。 它會:
通過在 xaml 中設置用戶控件的DataContext
屬性,在用戶控件內創建一個ExampleViewModel
類型的視圖 model
在 xaml 中創建一個文本框並將其綁定到視圖模型TextInViewModel
字符串屬性。
設置通常的INotifyPropertyChanged
接口(這被提取到基礎 class ViewModelBase
)
在 xaml 中創建視圖 model 並將用戶控件數據上下文設置為它:
<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>
視圖模型:
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()
{
}
}
綁定有兩種方式:即從源(例如視圖模型)到目標(例如用戶控件)和從目標返回到源。
您通過綁定模式指定方向。
以下是BindingModes :
在您的情況下,如果要將用戶控件的寬度屬性綁定到 ViewModel 的 TheWidth 屬性:
案例一:
想要雙向綁定,使用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>
XAML
<UserControl.DataContext>
<vm:ViewModel/>
</UserControl.DataContext>
我更喜歡 ViewModel Locator 方法(這就像 ViewModel 的服務定位器模式)。 因為一旦您的 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
通過綁定我親愛的朋友..
例如:(假設在您的上下文中)
如果你有 class "Person" 並且你的人有一個 Name 和 SurName 公共屬性並且你想將它綁定到一個文本框。 您執行以下操作:
<TextBox Text="{Binding Path=Name}" />
這僅在名稱是您的公共屬性時才有效,最佳做法是將您的 object(在本例中為 Person)作為公共屬性並以不同方式使用 Path 參數。
例子:
<TextBox Text="{Binding Path=Person.Name}" />
它確實使您的代碼更加混亂,然后在您的視圖模型中為您的視圖模型中的任何 object 的每個屬性創建一個屬性。
好吧,您將 UI 元素綁定到它們:
<UserControl Width="{Binding Path=DisplayWidth, Mode=OneWayToSource}">
<Grid>
<TextBox MinWidth=100 Text="{Binding MyProperty}"/>
</Grid>
</UserControl>
假設像這樣的視圖 model :
class ViewModel
{
public string MyProperty { get; set; }
public int DisplayWidth { get; set; }
}
“如何從 XAML 設置 ViewModel 的屬性?有可能嗎?”
所以,這似乎是不可能的,你可以做到的最大 - 雙向綁定,不幸的是,這不是我想要的。 總而言之,這是一個糟糕的設計而不是一個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.