WPF:双向绑定未设置源

时间:2018-10-31 15:38:10

标签: c# wpf

我的双向绑定仅从源代码到文本框都有效-当我从后台代码中更改它时,我可以看到文本框中的默认值,甚至可以看到新值,但是当我在文本框中更改文本时即使在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也会使我感到困惑。

1 个答案:

答案 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元素,当源发生更改时应更新其值,如上述代码所示。