我有一个绑定到 People 集合的 DataGrid。我还有一个 TextBox 应该接受来自所选行的 Name 值。然后,用户可以编辑该值或保持原样。关键点是:TextBox 中显示的文本无论是来自集合还是用户输入,都必须传播到属性 NewName。
我为 NewNameTextBox 设置了两个绑定:OneWay'ed 到 DataGrid 后面的 CollectionView,OneWayToSource'ed 到属性:
<Window.Resources>
<CollectionViewSource x:Key="PeopleCollection"
Source="{Binding Path=People, Mode=OneWay}" />
<local:ConverterNewNamePrefill x:Key="ConverterNewNamePrefill" />
</Window.Resources>
<Grid>
<StackPanel>
<DataGrid ItemsSource="{Binding Source={StaticResource PeopleCollection}}"
AutoGenerateColumns="True"
IsReadOnly="True"
Margin="10">
</DataGrid>
<StackPanel Orientation="Horizontal" Margin="10">
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource ConverterNewNamePrefill}" >
<Binding Source="{StaticResource PeopleCollection}" Path="Name" Mode="OneWay" />
<Binding Path="NewName" Mode="OneWayToSource" />
</MultiBinding>
</TextBox.Text>
</TextBox>
</StackPanel>
</StackPanel>
</Grid>
我想当用户更改 DataGrid 中的选择时应该更新该属性,但这不会发生。TextBox 得到更新并显示选定的 Name 值,但通过 OneWayToSource 绑定的属性保持不变。
如果用户在 TextBox 中键入内容,则该属性会按预期更新。
所以问题是如何通过多绑定 TextBox 从两个源更新属性,而无需代码隐藏视图?
这是窗口后面的代码:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private ObservableCollection<Person> _people = new ObservableCollection<Person> {
new Person() {Name = "Mitchell", Surname = "Sofia" },
new Person() {Name="Bush", Surname="Ethan" },
new Person() {Name="Ferrero", Surname="Emma" },
new Person() {Name="Thompson", Surname="Aiden" }
};
public ObservableCollection<Person> People => _people;
public string NewName { get; set; } = "Jackson";
}
public class ConverterNewNamePrefill : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new[] { value, value };
}
}
转换器的方法 ConvertBack() 仅在用户键入时调用,而不是在 TextBox.Text 从集合中更新时调用。
谢谢!