在双向绑定中使用IValueConverter和当前的DataContext

时间:2010-12-10 08:37:30

标签: wpf data-binding datacontext converter ivalueconverter

我遇到了转换器的问题,我用它来转换字符串和时间格式。转换器本身工作正常,并按照以下方式实现:

    [ValueConversion(typeof(string), typeof(SimpleTime))]
    public class StringToSimpleTimeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert from string to SimpleTime and return it
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert value from SimpleTime to string and return it
        }
    }

使用转换器的XAML在usercontrol.resources中包含转换器本身,如下所示:

<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/>

如果遇到属性(我在后台使用wpf工具包中的datagrid),则使用用于编辑simpletime的datatemplate:

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>

我遇到的问题是转换器需要在绑定中指定路径,如果它是双向转换器(我需要在两个方向上),但我想要设置的属性已经是当前的DataContext - 那么我可以指定哪条路径?

我能想到的唯一解决方法是在SimpleTime中引入一个虚拟属性,它只获取当前的SimpleTime或设置它。

public class SimpleTime
{
    ...
    public SimpleTime Clone
    {
        get { return new SimpleTime(_amount, _format); }
        set { this._amount = value._amount; this._format = value._format; }
    }
}

并通过

绑定到那个
 <TextBox Text="{Binding Clone, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>

工作正常,但实际上并不是一个合适的解决方案,特别是如果我需要更多次转换器......

任何帮助表示赞赏  干杯,曼尼

3 个答案:

答案 0 :(得分:5)

我认为你可以像这样解决它

<TextBox Text="{Binding Path=DataContext,
                        RelativeSource={RelativeSource Self},
                        Converter={StaticResource stringToSimpleTimeConverter}, 
                        Mode=TwoWay}"/>

答案 1 :(得分:0)

为什么不创建类似于以下内容的容器类,而不是在类中引入虚拟属性:

public class Container
{
    public Object DataItem { get; set; }

    //...
}

并使用它:

<TextBox Text="{Binding DataItem, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>

这不会破坏/改变你现有的课程,但仍允许你做你想做的事。

答案 2 :(得分:0)

我知道这是一个古老的问题,但如果有人偶然发现这一点,那么正确的路径就是Path=.

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding Path=., Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>