Проблема привязки данных - DataTemplate / ViewModel / ICollectionView - PullRequest
1 голос
/ 25 июля 2011

Первоначально я разместил это на форуме 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>

...

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

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

    public ObservableCollection Results {get; задавать; }

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

  3. Добавлен следующий код в 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; }
    ...

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

Ответы [ 2 ]

0 голосов
/ 25 июля 2011

Не уверен, что это проблема в вашем случае, но DataGrid использует вариант привязки данных, который не будет фиксировать изменения в источнике, пока вы не переместитесь из строки. Это называется BindingGroup. Может быть, вы не видите зафиксированные значения, потому что еще не покинули строку?

http://blogs.msdn.com/b/vinsibal/archive/2008/08/11/wpf-3-5-sp1-feature-bindinggroups-with-item-level-validation.aspx

Еще одна возможность состоит в том, что путь привязки как-то не верен? Вы проверили окно вывода в VS, чтобы увидеть, сообщает ли оно о каких-либо ошибках связывания?

0 голосов
/ 25 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...