WPF双向绑定到当前源与转换器?

问题描述:

当绑定到当前源(Path =“。”)并使用转换器时,WPF中的数据绑定是否存在问题?双向绑定似乎不适用于这种情况。WPF双向绑定到当前源与转换器?

我知道我可以改变路径,但我希望能够将“名称”值传递给转换器。

我不能让下面的示例工作:

<Window x:Class="WpfTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:l="clr-namespace:WpfTest" 
Title="Window1" Height="600" Width="600"> 

<Window.Resources> 
    <l:Person x:Key="myDataSource" Name="Cam"/> 

    <l:TestConverter x:Key="converter" /> 
</Window.Resources> 

<StackPanel> 
    <StackPanel.DataContext> 
     <Binding Source="{StaticResource myDataSource}"/> 
    </StackPanel.DataContext> 

    <TextBox> 
     <TextBox.Text> 
      <Binding 
       Path="." 
       UpdateSourceTrigger="PropertyChanged" 
       Converter="{StaticResource converter}" 
       ConverterParameter="Name" 
       /> 
     </TextBox.Text> 
    </TextBox> 
    <TextBlock Text="{Binding Path=Name}"/> 
</StackPanel> 
</Window> 

class TestConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Reverse(value, parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Reverse(value, parameter); 
    } 

    private static object Reverse(object value, object parameter) 
    { 
     if (value == null) 
      throw new ArgumentNullException("value", "value is null."); 
     if (parameter == null) 
      throw new ArgumentNullException("parameter", "parameter is null."); 

     Person p = (Person)value; 

     if (parameter.ToString() == "Name") 
     { 
      StringBuilder sb = new StringBuilder(); 
      for (int i = p.Name.Length - 1; i >= 0; i--) 
      { 
       sb.Append(p.Name[i]); 
      } 

      return sb.ToString(); 
     } 

     throw new NotImplementedException(); 
    } 
} 

public class Person:INotifyPropertyChanged 
{ 
    private string name; 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

卡梅伦,

我不是这真的确定你想要做什么。

您绑定到“。”这意味着您需要能够将字符串转换为Person和Person以字符串,但是您的实现不会执行此操作。但是,你会改变资源myDataSource指向的实例。我不确定你能做到这一点。

如果你只是想修改字符串,为什么你不指定Binding.Path作为“名称”,并提供一个转换器,做你想要的字符串?

山姆

+0

你是对的,ConvertBack可能不会工作。现在,如果它抛出一个异常,我会很高兴,但绑定甚至不会调用该方法。 – 2008-11-17 22:39:28

您不能同时采用两种方式与电流源(带或不带转换器)结合。

在没有转换器的情况下考虑一下,绑定到当前源时没有要设置的属性 - 除了DataContext本身通常从其他源派生(例如,它可能被设置为列表ItemControl),所以没有必要重写DataContext属性。

因此,WPF不会尝试将更改绑定回源,因为它无法更改源。

现在,一个自定义的ValueConverter显然可以做任何事情,包括不仅仅是价值约定但在您的特定情况下很有用的东西,但值转换器只是应该转换值类型 - 系统无事可做在这种情况下,由于值转换器的结果,无法将其分配给 - 所以调用值转换器没有意义。