Привязка и обновление DataContext

Мой сценарий:

У меня есть окно WPF с 3 текстовыми полями с привязкой к данным

SettingsUI : Window

<Grid Name = "SettingsUIGrid1">
    <TextBox Text = "{Binding val1}" ....
    <TextBox Text = "{Binding val2}" ....
    <TextBox Text = "{Binding val3}" ....
</Grid>

В конструкторе делаю так:

SettingsUIGrid1.DataContext = coll[0]; // collection first value

Когда нажимается кнопка Отмена, я закрываю окно:

private void btnCancel_Click(object sender, RoutedEventArgs e) {
Close();
}

Когда я нажимаю кнопку «Показать», отображаются значения из БД в текстовых полях, если пользователь изменяет значение текстового поля и перезагружает окно, отображается новое значение, а не старое. Может ли кто-нибудь предложить, что делать, чтобы снова перезагрузить значения и очистить объект в памяти?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
23 077
5

Ответы 5

Я бы предложил добавить код в событие нажатия кнопки отмены, чтобы проверить, были ли какие-либо данные изменены по сравнению с тем, что было изначально загружено, поскольку я предполагаю, что если они не нажмут кнопку отмены, другая кнопка будет сохранена / ОК, что означает, что данные будут зафиксированы в базе данных.

Что такое колл?

если это DataTable, вы можете использовать это:

private static bool DataRowReallyChanged(DataRow row)
    {
        if (row == null)
        {
            return false;
        }

        if (!row.HasVersion(DataRowVersion.Current) || (row.RowState == DataRowState.Unchanged))
        {
            return false;
        }

        foreach (DataColumn c in row.Table.Columns)
        {
            if (row[c, DataRowVersion.Current].ToString() != row[c, DataRowVersion.Original].ToString())
            {
                return true;
            }
        }

        return false;
    }

затем просто добавьте вызов в событие кнопки отмены, например:

if (DataRowReallyChanged((DataRow)SettingsUIGrid1.DataContext))
{
     ((DataRow)SettingsUIGrid1.DataContext).RejectChanges();
}

Надеюсь, это поможет. Если вы не используете DataTable, дайте мне знать, что вы используете, и я посмотрю, смогу ли я помочь в дальнейшем.

Связывание работает двумя способами: оно принимает значение и устанавливает его редактируемым в текстовом поле, а если значение изменяется, оно обновляет исходное значение объекта ...

Если вы хотите только показать данные, вы можете использовать параметр Mode = OneTime в привязке

{Binding Path =val1, Mode=OneTime}

Это будет оценивать данные только один раз.

Если вам действительно нужно изменить данные, убедитесь, что вы клонируете или используете другой объект для своего свойства источника данных. Таким образом, вы можете отказаться от объекта источника данных, если он больше не нужен ...

HTH

Хорошо, извините, просто чтобы прояснить все, что вы загружаете коллекцию из базы данных и заполняете свои текстовые поля, пользователь может затем изменить эти значения, которые в зависимости от того, нажимают ли они сохранить / ОК или отменить, сохранят или не сохранят изменения соответственно. если это так, я бы использовал решение arcturus.

Я использовал свое решение, когда мы создали наши собственные «типизированные» DataSet, в которых реализован IEnumerable, чтобы упростить жизнь, чем необходимость постоянно заполнять коллекции. Хотя мне уже хочется, чтобы мы использовали LINQ.

Я сделал это таким образом -> добавил еще текстовое поле, связал его с идентификатором объекта (там должен быть только один объект, так как у меня есть только одна запись, в которой хранятся все мои настройки), и использовал Mode = OneTime для всех привязок. .... так что, если пользователь сохранит, он обновит существующий объект. Отмена будет работать сейчас ..................... уф!

Если вы не хотите изменять свои данные, вы можете установить привязку как OneWay:

<Grid Name = "SettingsUIGrid1">
<TextBox Text = "{Binding Path =val1, Mode=OneWay}" ....
<TextBox Text = "{Binding Path =val2, Mode=OneWay}" ....
<TextBox Text = "{Binding Path =val3, Mode=OneWay}" ....
</Grid>

Другие вопросы по теме