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}”?也就是说,没有逗号。