Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在双向绑定中对当前DataContext使用IValueConverter_Wpf_Data Binding_Datacontext_Converter_Ivalueconverter - Fatal编程技术网

Wpf 在双向绑定中对当前DataContext使用IValueConverter

Wpf 在双向绑定中对当前DataContext使用IValueConverter,wpf,data-binding,datacontext,converter,ivalueconverter,Wpf,Data Binding,Datacontext,Converter,Ivalueconverter,我使用的转换器在字符串和时间格式之间转换时出现问题。转换器本身工作正常,实现方式如下: [ValueConversion(typeof(string), typeof(SimpleTime))] public class StringToSimpleTimeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter,

我使用的转换器在字符串和时间格式之间转换时出现问题。转换器本身工作正常,实现方式如下:

    [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
        }
    }
<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/>
使用转换器的XAML在usercontrol.resources中包含转换器本身,如下所示:

    [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
        }
    }
<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/>
并通过

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

这很好,但不是一个真正合适的解决方案,特别是如果我需要更多的时间转换器

谢谢你的帮助
干杯,manni

与其在类中引入虚拟属性,不如创建一个如下所示的容器类:

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

    //...
}
然后像这样使用它:

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


这不会损坏/改变您现有的类,并且仍然允许您执行希望执行的操作。

我认为您可以这样解决它

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

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

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


好主意,但对于我的数据结构来说并不可行。我不想将每个属性都放入容器中,父列表对象直接绑定到datagrid,datagrid为类a列中的每个属性选择要显示和编辑的属性,将属性直接设置为datacontext。我认为您要做的是将每个属性设置为
控件的
datacontext
,并使用
{Binding}
绑定它们,而不指定路径。如果这是你正在做的,那就错了。您应该设置父控件的
DataContext
,并且所有子控件都派生它。并且只在子控件中使用使用不同路径的绑定。我认为datagridcolumns就是这样工作的。我用于在datagrid中显示或编辑gridcell的datatemplate不能将datacontext设置为完整的结构,因为这意味着它现在必须使用它应该应用的属性的名称。我想要的是将datatemplate应用于特定类型,而不知道它的名称,因此我的codebehind设置datagridcolumn的绑定,并设置其datatemplates以进行显示和编辑。datatemplate本身应用于多个propertyname,具体取决于属性的类型经过大量的尝试和思考,我得出了您的结论。毕竟,这是错误的,因为它无法切换其绑定的整个属性,而不是切换父datacontext中的属性。我将不得不改变我的设计来融入其中。谢谢你的帮助,可惜我不能将两个答案都标记为正确,谢谢againi尝试了一种类似的方法,使用文本框的父用户控件并绑定到它的datacontext。IValueConverter被正确调用以将字符串转换为simpletime并返回以在控件中显示字符串,但我的数据结构中simpletime属性的集合从未被调用-有人知道这是如何发生的吗?@manni:我用它制作了一个测试应用程序,对我来说它似乎工作得很好。它绑定到自己的DataContext,因此我认为它没有理由不工作。你确定你的ConvertBack方法从未被调用吗?谢谢你的努力。我想我想说的还不够清楚:如果我在gui中更改值,就会调用我的convertback和convert方法,这很好。但是我正在设置的属性(simpletime属性)的属性设置器没有被调用(断点没有被触发)。现在我将对此进行研究,非常感谢您的帮助,我非常感谢我构建了另一个示例,您的方法在直接使用它时运行良好。在datatemplate或datagridcolumn中使用它时,我似乎有一个bug。再次感谢您的帮助为什么不只是“{Binding Converter={StaticResource stringToSimpleTimeConverter},Mode=TwoWay}”?也就是说,没有逗号。