Привязка и обновление DataContext - PullRequest
3 голосов
/ 19 ноября 2008

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

У меня есть окно 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();
}

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

Ответы [ 5 ]

4 голосов
/ 19 ноября 2008

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

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

{Binding Path =val1, Mode=OneTime}

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

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

НТН

0 голосов
/ 19 ноября 2008

Если вы не хотите изменять свои данные, вы можете установить привязку к 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>
0 голосов
/ 19 ноября 2008

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

0 голосов
/ 19 ноября 2008

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

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

0 голосов
/ 19 ноября 2008

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

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

если это 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, дайте мне знать, что вы используете, и не пойму, смогу ли я помочь в дальнейшем.

...