2008-11-19 5 views
2

Мой сценарий является:DataContext Связывание и Refresh

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

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

ответ

0

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

Что такое coll?

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

4

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

Если вы только хотите, чтобы показать данные, вы можете использовать режим = одноразовый вариант в Binding

{Binding Path =val1, Mode=OneTime} 

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

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

НТН

0

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

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

0

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

0

Если вы не хотите, чтобы изменить свои данные, вы можете установить вы связывание быть 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> 
Смежные вопросы