簡體   English   中英

從 XAML 設置 ViewModel 的屬性

[英]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

  • 雙向
  • 單程
  • 一度
  • OneWayToSource

在您的情況下,如果要將用戶控件的寬度屬性綁定到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM