Проблема с привязкой данных - DataTemplate / ViewModel / ICollectionView

Сначала я разместил это на форуме PRISM4, но получил предложение попробовать и этот форум :) Я использую WPF4 BTW ...

Я запускаю PRISM4 и изо всех сил пытаюсь заставить работать привязку данных. Я следую шаблону MVVM и имею модель представления, которая изначально загружает данные из СУБД и обертывает их в ICollectionView. Это отлично работает, данные отображаются в привязанном DatGrid, но я изо всех сил пытаюсь сохранять изменения, внесенные в данные, представленные в DataGrid, объявленном ниже.

Модель представления публикует ICollectionView через свойство чтения / записи «Results», которое, как вы можете видеть, имеет режим привязки «TwoWay». Я думал, что этого будет достаточно, чтобы сохранить изменения, внесенные в состояние флажков, но нет :( Я экспериментировал с несколькими способами, чтобы добиться этого, но состояние флажка не передается обратно в модель представления. I ' он перехватил вызов метода «PlotClicked», который является объектом ICommand, но переданный аргумент имеет неизменный атрибут «Plot»! Это особенно очевидно, когда я щелкаю один из заголовков столбца и представление сортируется - отмеченные строки unchecked, что является состоянием флажков по умолчанию при извлечении из базы данных.

Что я здесь делаю не так?

Заранее большое спасибо - я действительно застрял здесь :( / 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>

...

Я попробовал указанные мне предложения. Вот что я сделал:

  1. В модели представления я изменил свойство Result с ICollectionView на OC

    общедоступные результаты ObservableCollection {получить; набор; }

  2. Добавлены следующие ресурсы шаблона для UserControl, составляющего представление

  3. Добавлен следующий код в DataGrid в разделе «Столбцы».

        <DataGridTemplateColumn
            Header="cbTest"
            x:Name="cbTest"
            CellTemplate="{StaticResource IsSelectedColumnTemplate}"
            CellEditingTemplate="{StaticResource IsSelectedColumnTemplateEditing}"
            CanUserSort="True"
            Width="Auto"
            />
    

После внесения этих изменений я поэкспериментировал с различными настройками UpdateSourceTrigger в IsChecked = "{Привязка, упомянутая ... в (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; }
    ...

Это не сработало в том смысле, что для свойства «Plot property» НИКОГДА нельзя было установить значение 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; }
    ...

Результат, спросите вы? Это работает, и «Сюжет» настроен правильно! Вот, подумал я, это странно !!! Итак, я сделал следующее (просто закомментировал частную переменную и получил / установил код):

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; }
    ...

Хорошо, а как насчет результата? ОНО РАБОТАЕТ!!!??? Я ошеломлен ... В смысле какая разница между первым и последним ???? Мне ОЧЕНЬ неловко по этому поводу - я хочу знать, ЧТО здесь происходит за кулисами ... :(


person Kodo    schedule 25.07.2011    source источник
comment
Привет, Кодо, и добро пожаловать в Stack Overflow. Кажется, ваш вопрос уже задавался раньше: см. stackoverflow.com/questions/2929627/. Боюсь, что в результате ваш вопрос может быть закрыт как «точный дубликат». В любом случае, я надеюсь, что вопрос, на который я ответил, вам поможет.   -  person Luke Woodward    schedule 25.07.2011
comment
Привет! Спасибо за ваше предложение, но это мне не помогло, поэтому я добавил дополнительную информацию ...   -  person Kodo    schedule 25.07.2011
comment
Если вы установите точку останова в свойстве Plot, правильно ли вызываются методы get и set?   -  person Rachel    schedule 25.07.2011
comment
Привет, Рэйчел! Я ошеломлен! Пожалуйста, загляните в раздел ОБНОВЛЕНИЕ выше ...   -  person Kodo    schedule 26.07.2011
comment
Есть ли у кого-нибудь объяснения / предложения по поводу странного поведения? Я сделал множество чистых / перестроенных проектов, но проблема осталась, пока я не начал изменять код получения / установки и возвращать его обратно ... Кроме того, в последнее время я не делал никаких автоматических обновлений, которые могли изменить некоторые сборки . Í предпочитаю знать и понимать, что происходит, но в данном случае я потерялся в двоичном пространстве ... Конечно, я рад, что это работает, но я абсолютно НЕ понимаю, что СДЕЛАНО это сработало :(   -  person Kodo    schedule 27.07.2011


Ответы (2)


Не уверен в этом, но я бы посоветовал вам попробовать использовать ObservableCollection как ItemsSource. Раньше у меня было много подобных проблем, все они были решены с помощью такой коллекции (которая, кстати, быстрее и потребляет меньше ресурсов, чем классическая коллекция для освежающих целей).

Также попробуйте добавить в IsChecked привязку следующее: UpdateSourceTrigger=PropertyChanged, это может помочь, я думаю, единственная проблема здесь в том, что исходный код не обновляется в нужное время!

person Damascus    schedule 25.07.2011
comment
Привет! Спасибо за ваше предложение, но это мне не помогло, поэтому я добавил дополнительную информацию ... - person Kodo; 25.07.2011