从DependecyProperty绑定到XAML中的DataContext(ViewModel)

时间:2012-10-24 15:10:40

标签: c# wpf mvvm binding dependency-properties

假设这种情况:
我用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属性。

我想以同样的方式使用我的控件。

5 个答案:

答案 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