我有一个绑定到这样的对象的实体框架模型:
public class Object
{
public string _name; //actual name
public string _display_name;
....
}
display_name大部分与actual_name相同。因此,在WPF窗口中,我有一个带有两个输入的视图(TextBox)。
第一个输入绑定到View Model属性DisplayName。这样做的目的是使第二个输入(显示名称)默认等于第一个(实际名称):
<TextBox x:Name="NameInputBox" Margin="5,5,5,5" Width="100" MaxLength="50"
Text="{Binding Path=Name, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
第二个输入是使用MultiBinding。 MultiBinding中的第一个绑定是第一个输入的Text属性。这会正确地将第二个框更新为等于第一个框。
第二个绑定绑定到视图模型中的DisplayName属性。尽管第二个输入文本正在改变,但未设置DisplayName属性:
<TextBox x:Name="DisplayNameInput" Margin="5,5,5,5" Width="100" MaxLength="50">
<TextBox.Text>
<MultiBinding Converter="{StaticResource TwoToOneConverter}">
<Binding ElementName="NameInputBox" Path="Text" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="DisplayName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBox.Text>
</TextBox>
以下是属性:
public String Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public string DisplayName
{
get { return _display_name; }
set
{
_display_name = value;
OnPropertyChanged("DisplayName");
}
}
最后,我的转换器:
/// <summary>
/// When given two inputs, just take one of them.
/// </summary>
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return values[0];
}
/// <summary>
/// Return the value, unchanged, as two values.
/// </summary>
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
return new object[] { value, value };
}
任何人都对我做错了什么有任何想法?我觉得它与转换器有关,因为我没有按照在线样本中描述的方式使用它。还有另一种方法可以实现我的目标吗?
答案 0 :(得分:1)
我认为从代码中执行此操作会更有意义:如果_display_name
为null
,则DisplayName
会返回Name
。这也意味着您需要将OnPropertyChanged("DisplayName");
添加到Name
二传手:
public String Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
OnPropertyChanged("DisplayName");
}
}
public string DisplayName
{
get { return _display_name ?? _name; }
set
{
_display_name = value;
OnPropertyChanged("DisplayName");
}
}
有了这个,您可以使用普通Binding
代替MultiBinding
,因此设置值应该没有问题。