WPF: двусторонняя привязка не устанавливает источник - PullRequest
0 голосов
/ 31 октября 2018

Моя двусторонняя привязка просто работает из источника в TextBox - я вижу значение по умолчанию в TextBox и даже новое значение, когда я изменяю его из кода, но когда я изменяю текст в TextBox значение не обновляется в модели, даже если TextBox теряет фокус. 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 голосов
/ 31 октября 2018

Во-первых, ваш 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 к сценарию привязки, как показано в приведенном выше коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...