我的双向绑定仅从源代码到文本框都有效-当我从后台代码中更改它时,我可以看到文本框中的默认值,甚至可以看到新值,但是当我在文本框中更改文本时即使在TextBox失去焦点之后,该值也不会在Model中更新。还设置了DataContext。
Version.Set甚至没有被调用-通过设置断点进行测试。
XAML:
<DataGrid ItemSource="{Binding Issues}">
<DataGrid.RowDetailsTemplate>
<TextBox Text="{Binding Path=TestReport.Version, Mode=TwoWay}"/>
</DataGrid.RowDetailsTemplate>
</DataGrid>
型号:
public class TestIssue
{
public JiraIssue Issue { get; set; }
public TestReport TestReport { get; set; }
}
public class TestReport : INotifyPropertyChanged
{
private string version = "Defalut Value";
public string Version
{
get => this.version;
set
{
if (value == this.version) return;
this.version = value;
this.OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
后面的代码:
public partial class MainWindow : Window
{
public ObservableCollection<TestIssue> Issues { get; set; } = new ObservableCollection<TestIssue>();
public MainWindow()
{
this.DataContext = this;
this.InitializeComponent();
}
}
编辑:明确设置UpdateSourceTrigger的工作原理,甚至将其设置为FocusLost也会使我感到困惑。
答案 0 :(得分:2)
首先,您的XAML代码不正确,应该是这样的:
<DataGrid ItemsSource="{Binding Issues}">
<DataGrid.RowDetailsTemplate>
<ItemContainerTemplate >
<TextBox Text="{Binding Path=TestReport.Version, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</ItemContainerTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
您不能将<TextBox/>
元素直接放置在<DataGrid.RowDetailsTemplate>
内,而应将其放置在<ItemContainerTemplate >
内。
要更新TextBox
,您需要通过向绑定脚本中添加TextBox
来告知UpdateSourceTrigger=PropertyChanged
元素,当源发生更改时应更新其值,如上述代码所示。