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作为“名称”,并提供一个转换器,做你想要的字符串?
山姆
答
您不能同时采用两种方式与电流源(带或不带转换器)结合。
在没有转换器的情况下考虑一下,绑定到当前源时没有要设置的属性 - 除了DataContext本身通常从其他源派生(例如,它可能被设置为列表ItemControl),所以没有必要重写DataContext属性。
因此,WPF不会尝试将更改绑定回源,因为它无法更改源。
现在,一个自定义的ValueConverter显然可以做任何事情,包括不仅仅是价值约定但在您的特定情况下很有用的东西,但值转换器只是应该转换值类型 - 系统无事可做在这种情况下,由于值转换器的结果,无法将其分配给 - 所以调用值转换器没有意义。
你是对的,ConvertBack可能不会工作。现在,如果它抛出一个异常,我会很高兴,但绑定甚至不会调用该方法。 – 2008-11-17 22:39:28