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>
答案 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 -->
如果要这样做,您应该以编程方式创建视图模型,例如在视图的代码隐藏中。