如何将ViewModel属性绑定到转换器中的依赖项属性

时间:2016-11-25 21:11:06

标签: c# wpf xaml mvvm

<Window.Resources>
    <local:WeightConverter x:Key="weightConverter" RequiredUnit="{Binding VmProp}" /> 

 <TextBlock Text="{Binding Weight, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource weightConverter}}" />



public MainWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();

在MyViewModel中我有常规属性

    private string vmProp;

    public string VmProp
    {
        get
        {
            return "kg";
        }
    }

转换器类的DependencyProperty是:

 public class WeightConverter : DependencyObject, IValueConverter
{
    public static readonly DependencyProperty RequiredUnitProperty = DependencyProperty.Register("RequiredUnit", typeof(string), typeof(WeightConverter), null);
    public string RequiredUnit
    {
        get
        {
            return (string)this.GetValue(RequiredUnitProperty);
        }

        set
        {
            this.SetValue(RequiredUnitProperty, value);
        }
    }


    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
                   double dblValue;

        if (double.TryParse(value.ToString(), out dblValue))
        {
            if (this.RequiredUnit == "kg")
            {
                return dblValue;
            }

            else
            {
                return dblValue * 10;
            }

            return dblValue;
        }

        return 0;
    }

当我在XAML中进行绑定时,代码可以工作:

    <Window.Resources>
    <local:WeightConverter x:Key="weightConverter" RequiredUnit="kg"/>  

但是当我尝试将它绑定到ViewModelProperty时,&#39; RequiredUnit&#39;对象始终为空。

如何将依赖项属性绑定到ViewModel属性?

2 个答案:

答案 0 :(得分:0)

其null的原因是您尝试从资源绑定到视图模型属性,但资源不能使用datacontext。在输出日志中,您必须获取绑定表达式错误。看一下输出窗口。

有多种方法可以实现这一目标。 一种方法是给你的窗口命名为x:Name =&#34; MainWindow&#34;然后在你的装订中做:

<local:WeightConverter x:Key="weightConverter" RequiredUnit="{Binding DataContext.VmProp, ElementName=MainWindow}" />

另一种方法是使用相对源绑定来完成它。

答案 1 :(得分:0)

x:Name="leapold"放入Window / Usercontrol

并使用x:reference

进行绑定
<local:WeightConverter x:Key="weightConverter" RequiredUnit="{Binding DataContext.VmProp, Source={x:Reference leapold}}"/>