6

我在使用转换器在字符串和我们的时间格式之间进行转换时遇到问题。转换器本身工作正常,并像这样实现:

    [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 工具包中的数据网格),则使用用于编辑 simpletime 的数据模板:

<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}"/>

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

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

4

3 回答 3

5

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

<TextBox Text="{Binding Path=DataContext,
                        RelativeSource={RelativeSource Self},
                        Converter={StaticResource stringToSimpleTimeConverter}, 
                        Mode=TwoWay}"/>
于 2010-12-10T08:55:03.353 回答
0

与其在你的类中引入一个虚拟属性,不如创建一个像下面这样的容器类:

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

    //...
}

并像这样使用它:

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

这不会破坏/改变您现有的课程,并且仍然允许您做您想做的事情。

于 2010-12-10T08:54:30.400 回答
0

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

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding Path=., Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>
于 2018-04-27T12:34:14.403 回答