假设这种情况:
我用DependencyProperty“SuperValue”创建了一个新的控件(“MyControl”)
现在,在XAML中,我将“SuperValue”设置为“TestValue”:
<local:MyControl SuperValue="TestValue" />
此控件具有ViewModel(DataContext) 我想将DependencyProperty的值(在此示例中为“TestValue”)传递给ViewModel中的属性。
我该怎么做?
假设我的控件的ViewModel做了一些计算,例如:用户输入国家/地区的名称,控件给他一个当前的时间。
问题是:我如何提供计算结果?假设这是ViewModel中的公共属性“Results”。我想创建一个像“TextBox.Text”,“ListView.SelectedItem”这样的属性,它向外部提供ViewModel数据的一部分。
例如TextBox和Text属性:
<TextBox Text={Binding GiveMeTextValue} />
在这种情况下,DP“Text”向外部提供当前存储输入文本的ViewModel属性。
我想以同样的方式使用我的控件。
答案 0 :(得分:3)
我不知道我的问题是否正确:您想在XAML中将静态非绑定值设置为控件的DependencyProperty,并将控件的DataContext上的属性设置为此静态值?如果您需要这样做,那么您的概念有问题,为什么不在相应字段中的ViewModel上提供此值并将控件的DP绑定到此字段?
但是,你可以做什么得到你想要的东西:
注册DP时定义 PropertyChangedCallback :
// Dependency Property
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(string),
typeof(MyControl), new FrameworkPropertyMetadata("123", new PropertyChangedCallback(OnTestChanged)));
在OnTestChanged方法中,将DataContext强制转换为ViewModel的类型,并将ViewModel上的相应值设置为新值:
private static void OnTestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyControl c = d as MyControl;
ViewModelType vm = c.DataContext as ViewModelType;
vm.Property = e.New;
Console.WriteLine(e.NewValue);
}
这就是你要求的吗?
答案 1 :(得分:1)
如何从属性MyDependencyProperty
的{{1}}设置setter
。
修改强>
您可以设置使用控件的控件SomethingValueInDataContext
,而不是其声明。这将起作用(本地是控件所在的命名空间) -
DependencyProperty
与您一样,当您在xaml中创建它的实例时,您可以设置<Grid>
<local:MyOwnControl MyDependencyProperty="{Binding Test}"/>
</Grid>
的{{1}} -
Width
答案 2 :(得分:1)
请注意,您的xaml的根目录是UserControl
而不是 MyOwnControl
。 UserControl是MyOwnControl的基类;您的属性未在基类中定义。这就是您无法在MyDependencyProperty
的根元素中引用UserControl
的原因。
使用您的示例,您可以切换绑定并获得所需的效果。
<UserControl
x:Class="namespace.MyOwnControl"
x:Name="root">
<UserControl.DataContext>
<local:ControlViewModel
Test={Binding MyDependencyProperty, ElementName=root}" />
</UserControl.DataContext>
</UserControl>
答案 3 :(得分:1)
由于您使用的是MVVM设计范例,因此所有数据都应该与ViewModel相关。因此,应通过VM属性中的绑定来设置DP。
如果测试数据将在Blend / VS设计器中使用,您可以检查它与调试/发布...然后根据该测试检查对您的属性进行某种分配。
答案 4 :(得分:1)
您可以向名为MyControl
的{{1}}添加一个属性,该属性在设置时设置InitialSuperValue
的值。然后像这样写一些XAML:
SuperValue