获取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; //... } 

你最好使用IMul​​tiValueConverter和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方法的确切问题。 你能详细说明一下吗?