Первоначально я разместил это на форуме PRISM4, но получил предложение, что я должен
попробуйте и этот форум :) Я использую WPF4 BTW ...
Я использую PRISM4, и я изо всех сил пытался заставить мою привязку данных работать.
Я следую шаблону MVVM и имею модель представления, которая первоначально загружает
данных из РСУБД и оборачивает их в ICollectionView. Это отлично работает, данные отображаются в связанной DatGrid, но я пытаюсь изо всех сил при попытке сохранить
изменения, внесенные в данные, представленные в DataGrid, объявленном ниже.
Модель представления публикует ICollectionView через свойство чтения / записи,
«Результаты», который, как вы можете видеть, имеет режим привязки «TwoWay». я думал
этого будет достаточно, чтобы сохранить изменения, внесенные в состояние
флажки, но нет :( Я экспериментировал с несколькими способами сделать
это, но состояние флажка не распространяется обратно в модель представления.
Я перехватил вызов метода "PlotClicked", который является ICommand
объект, но передаваемый аргумент имеет неизменный атрибут "График"!
Это особенно очевидно, когда я нажимаю один из заголовков столбцов и
представление отсортировано - отмеченные строки не отмечены, что является состоянием по умолчанию для флажков при получении из базы данных.
Что я здесь не так делаю?
Заранее большое спасибо - я действительно застрял здесь :(
/ Peter
<DataGrid Grid.Row="0" Name="gridResults" ItemsSource="{Binding Results,Mode=TwoWay}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Plot">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Plot, Mode=TwoWay}"
HorizontalAlignment="Center"
Command="{Binding Path=DataContext.PlotClicked,Mode=OneWay, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
Я опробовал указанные мне предложения. Вот что я сделал:
В модели представления я изменил свойство Result с ICollectionView на OC
public ObservableCollection Results {get; задавать; }
Добавлены следующие ресурсы шаблона для UserControl, составляющего представление
Добавлен следующий код в DataGrid в разделе «Столбцы»
<DataGridTemplateColumn
Header="cbTest"
x:Name="cbTest"
CellTemplate="{StaticResource IsSelectedColumnTemplate}"
CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
CanUserSort="True"
Width="Auto"
/>
После внесения этих изменений я экспериментировал с различными настройками UpdateSourceTrigger в IsChecked = "{Binding упомянутый ... в (2) выше без эффекта. Изменения, которые я делаю в флажках, не переносятся обратно в представление -модель ObservableCollection.
Опять же, большое спасибо за попытку помочь мне здесь!
* ОБНОВЛЕНИЕ *
Теперь я испытал что-то ДЕЙСТВИТЕЛЬНО ПРИЗРАЧНОЕ :( Вот что я сделал:
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
Это не сработало в том смысле, что «Свойство графика» НИКОГДА не могло быть установлено равным true, если щелкнуть столбец флажка в DataGrid! Теперь я сделал следующее:
public class ResultViewResult : IReslutViewResult
{
private bool _plot;
public bool Plot
{
get
{
return _plot;
}
set
{
_plot = value;
}
}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
Результат вы можете спросить? Это работает, и «График» установлен правильно! Теперь я подумал, это странно !!! Итак, я сделал следующее (просто закомментировав приватный код var и get / set):
public class ResultViewResult : IReslutViewResult
{
public bool Plot { get; set; }
//private bool _plot = false;
//public bool Plot
//{
// get
// {
// return _plot;
// }
// set
// {
// _plot = value;
// }
//}
public Guid ResultId { get; set; }
public DateTime Generated { get; set; }
public int Duration { get; set; }
...
Хорошо, а как насчет результата? ОНО РАБОТАЕТ!!!??? Я ошеломлен ... Я имею в виду, какая разница между первым и последним ???? Я чувствую себя ОЧЕНЬ неловко из-за этого - я имею в виду, я хочу знать, ЧТО здесь происходит за кулисами ...: (