XAML中的对象初始值设定项

时间:2017-02-10 10:19:10

标签: c# .net wpf xaml

XAML对象初始值设定项如何与CLR属性一起使用?

如果我需要创建一个等效的XAML:

public MainWindow()
{
    InitializeComponent();

    this.DataContext = new MainWindowViewModel();
}

那就是:

<Window.DataContext>
    <vm:MainWindowViewModel/>
</Window.DataContext>

但如果我想要这样的话:

public string KeyFieldView { get; set; }

public MainWindow()
{
    InitializeComponent();

    this.DataContext = new MainWindowViewModel()
    {
        KeyFieldVM=KeyFieldView
    };
}

我能够直到KeyFieldVM="",但不知道如何访问KeyFieldView。

<Window.DataContext>
    <vm:MainWindowViewModel KeyFieldVM=""/>
</Window.DataContext>

2 个答案:

答案 0 :(得分:2)

您可以使用this answer中演示的ObjectDataProvider将构造函数参数传递给对象的实例化。但是,these parameters can't be bound。因此,您的动态属性值不能在构造函数中使用。

你必须使这些属性成为常量,并从XAML中传入它们,或者从后面的代码填充它们。

答案 1 :(得分:2)

您可以绑定KeyFieldVM属性,只要它是依赖属性:

public class MainWindowViewModel : DependencyObject
{
    public static readonly DependencyProperty KeyFieldVMProperty =
        DependencyProperty.Register("KeyFieldVM", typeof(string),
            typeof(MainWindowViewModel), new FrameworkPropertyMetadata("ok"));

    public string KeyFieldVM
    {
        get { return (string)GetValue(KeyFieldVMProperty); }
        set { SetValue(KeyFieldVMProperty, value); }
    }
}
<Window ... x:Name="win">
    <Window.DataContext>
        <vm:MainWindowViewModel KeyFieldVM="{Binding KeyFieldView, ElementName=win}"/>
    </Window.DataContext>
    <Grid>
        <TextBlock Text="{Binding KeyFieldVM}" />
    </Grid>
</Window>

这要求视图模型为DependencyObject,这有其缺点:

INotifyPropertyChanged vs. DependencyProperty in ViewModel

XAML是标记语言。它没有任何变量概念,所以你不能做这样的事情:

<vm:MainWindowViewModel KeyFieldVM="{this.KeyFieldView}"/> <!-- BAD MARKUP -->

如果要这样做,您应该以编程方式创建视图模型,例如在视图的代码隐藏中。