获取ConvertBack()方法中的Source值,以便在WPF绑定中实现IValueConverter
我将依赖属性绑定到WPF中的textboxex。 该属性是一个字符串,其中一些值以’/’分隔(例如:“1/2/3/4”)。 我需要将单个值绑定到单独的文本框,这对于以下Convert()
方法的实现很好:
public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture) { if (!string.IsNullOrEmpty(value as string)) { String[] data = (value as string).Split('/'); return data[Int16.Parse(parameter as string)]; } return String.Empty; }
我在xaml
使用ConverterParameter
来指定所需值的位置。 但是,问题在于ConvertBack()
方法。 我不知道,如何获取源值,这样我就可以只添加或更改字符串中的一个值(在指定位置)。
谢谢你的帮助。
在大多数情况下,您可以安全地使ConvertBack
抛出NotImplementedException
。
实际上,您还没有获得足够的信息来重建其源代码的来源!
如果你真的需要反向转换(例如,如果你使用双向绑定),我会在视图模型( DataContext
使用的类)中将属性拆分为3个字符串,并分别绑定它们。
更新
你可能已经在Vlad的帮助下解决了你的问题,我只是想我应该添加另一种方法来实际获取转换器中的源值。
首先,您可以使您的转换器从DependencyObject
派生,以便您可以向它添加一个依赖属性,我们将绑定它
public class MyConverter : DependencyObject, IValueConverter { public static DependencyProperty SourceValueProperty = DependencyProperty.Register("SourceValue", typeof(string), typeof(MyConverter)); public string SourceValue { get { return (string)GetValue(SourceValueProperty); } set { SetValue(SourceValueProperty, value); } } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { //... } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { object targetValue = value; object sourceValue = SourceValue; //... } }
不幸的是,转换器没有DataContext
因此Binding不会开箱即用,但你可以使用Josh Smith出色的DataContextSpy
: WPF中的人工inheritance上下文
更新结束
Dr.WPF对此有一个优雅的解决方案,请参阅以下主题
在ConvertBack()中访问绑定源的方法?
编辑
使用Dr.WPF的解决方案,您可以使用此(可能有点详细)示例代码将字符串索引和源TextBox
给转换器
1
然后您可以在ConvertBack方法中访问索引和TextBox
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { object[] parameters = parameter as object[]; short index = (short)parameters[0]; object source = (parameters[1] as TextBox).DataContext; //... }
你最好使用IMultiValueConverter和MultiBinding吗?
public interface IMultiValueConverter { object Convert(object[] values, Type targetType, object parameter, CultureInfo culture); object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture); }
在这种情况下,如果您真的希望能够编辑成分,则可以通过更复杂的对象来表示您的编号,该对象允许您通过索引器访问其4个组成部分。 这样它只是一个简单的绑定和访问4个部分的对象,可以拼凑整个数字:
public class MyNumber { public int this[int index] { get { /**/ } set { /**/ } } public string FullNumber { get { /**/ } } }
我刚刚建立了快速样本。 请检查您是否正在寻找相同的。 这在我的最后工作。
-
Xaml代码
-
代码背后
public class TextConverter : IValueConverter { #region IValueConverter Members public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string input = (string)value; char[] sep = {'/'}; string[] iparray = input.Split (sep); int index = Int32.Parse((string)parameter); return iparray[index]; } public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException (); } #endregion }
但是,我无法理解ConvertBack
方法的确切问题。 你能详细说明一下吗?