4

假设这种情况:
我用 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“文本”提供给当前存储输入文本的 ViewModel 属性之外。

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

4

5 回答 5

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);
        }

这是你要求的吗?

于 2012-11-04T21:44:26.237 回答
1

如何设置MyDependencyPropertyfrom setterof 属性SomethingValueInDataContext

编辑

您可以在使用控件DependencyProperty的位置而不是在其声明中设置控件。这将起作用(本地是控制所在的命名空间) -

<Grid>
   <local:MyOwnControl MyDependencyProperty="{Binding Test}"/>
</Grid>

就像您在 xaml 中创建实例时可以设置的Width一样-TextBox

<TextBox Width="{Binding PropertyName}"/>
于 2012-10-24T15:13:58.003 回答
1

由于您使用的是 MVVM 设计范例,因此所有数据都应与 ViewModel 相关。所以你的 DP 应该通过你的 VM 属性中的绑定来设置。

如果要在 Blend/VS 设计器中使用测试数据,您可以检查它与调试/发布...然后根据该检查对您的属性进行某种分配以进行测试。

于 2012-11-06T15:47:08.397 回答
1

您可以添加一个属性来MyControl调用InitialSuperValue,当设置时,设置的值SuperValue。然后像这样编写一些 XAML:

<local:MyControl InitialSuperValue="TestValue" SuperValue="{Binding SuperValueInViewModel, Mode=OneWayToSource}" />
于 2012-11-06T17:38:06.390 回答
1

请注意,您的 xaml 的根是UserControland not MyOwnControl。UserControl 是 MyOwnControl 的基类;您的属性未在基类中定义。这就是为什么您不能MyDependencyPropertyUserControl.

使用您的示例,您可以切换绑定并获得所需的效果。

<UserControl 
    x:Class="namespace.MyOwnControl"
    x:Name="root">
    <UserControl.DataContext>
         <local:ControlViewModel  
             Test={Binding MyDependencyProperty, ElementName=root}" />
    </UserControl.DataContext>
</UserControl>
于 2012-10-30T16:37:11.563 回答