gpt4 book ai didi

c# - WPF 多重绑定(bind) : OneWayToSource binding from TextBox updated via another binding doesnt work?

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:11 25 4
gpt4 key购买 nike

我有一个绑定(bind)到 People 集合的 DataGrid。我还有一个 TextBox,它应该接受所选行中的 Name 值。然后用户可以编辑该值或保留原样。关键点是:TextBox 中显示的文本,无论它来自集合还是用户键入,都必须传播到属性 NewName。

我为 NewNameTextBox 设置了两个绑定(bind):OneWay 绑定(bind)到 DataGrid 后面的 CollectionView,OneWayToSource 绑定(bind)到属性:

<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 绑定(bind)的属性保持不变。

如果用户在 TextBox 中键入内容,该属性将按预期更新。

所以问题是如何在没有代码隐藏 View 的情况下通过多绑定(bind) 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 从集合更新时不调用。

谢谢!

最佳答案

这就是绑定(bind)的工作原理。源或多个源不会更新,除非目标通过绑定(bind)本身以外的方式更改。 IE。假设如果目标刚刚从源更新,那么源已经是最新的并且不需要更新。

如果没有更多详细信息,就很难确定您想要什么。但看起来您可能希望 NewName 实际上是第二个绑定(bind)的 target,其中源是相同的 Name 属性用作 TextBox.Text 属性的来源,或者您想订阅 TextBox.TextChanged事件和您的处理程序在引发该事件时显式地将值写回 NewName 属性。

在前一种情况下,您必须使 NewName 成为 MainWindow 的依赖属性。这是您可能不想处理的并发症。如果没有,那么我会推荐后一种方法。

关于c# - WPF 多重绑定(bind) : OneWayToSource binding from TextBox updated via another binding doesnt work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com