使用MVVM WPF进行数据网格绑定

时间:2015-02-08 16:34:42

标签: c# wpf xaml mvvm datagrid

我在两个不同的地方使用mvvm面临数据网格绑定问题。我的datagrid(xaml)的标题是:

 <DataGrid Grid.Row="0" Grid.Column="0" AlternationCount="2" Background="White" RowHeight="28" HorizontalGridLinesBrush="Lavender" VerticalGridLinesBrush="Lavender"
           VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True"
           ScrollViewer.CanContentScroll="True" Name="MainGrid" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Visible" 
           HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False"
           CanUserDeleteRows="False" CanUserResizeRows="True" ItemsSource="{Binding Path=Configurations, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

clealy说

 ItemsSource="{Binding Path=Configurations, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

在我的viewmodel中:

public ObservableCollection<ViewerConfiguration> Configurations
{
    get { return m_tasks; }
    set { m_tasks = value; OnPropertyChanged("Configurations"); }
}

列表中的数据在视图中正确显示,但问题在于插入和删除(即使它成功更新)。 我有一个在Configuration对象中插入项目的函数

private void Refresh()
{
    List<ViewerConfiguration> newlyAddedFiles = GetConfigurations();
    foreach (ViewerConfiguration config in newlyAddedFiles)
    {
        Configurations.Add(config);
    }
}

并删除如:

 Configurations.Remove(configuration);

问题实际上是插入和删除。在调试时没有异常,它也成功从集合中删除,但UI没有收到通知。任何猜测为什么会出现这种行为?

此外: 我在datagrid下面有一个事件触发器:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding RenderPdf}" CommandParameter="{Binding SelectedItem, ElementName=MainGrid}"></i:InvokeCommandAction>
    </i:EventTrigger>
</i:Interaction.Triggers>

我正在从ViewModel的构造函数中调用Refresh函数,看看它是否有效。

1 个答案:

答案 0 :(得分:0)

最后我解决了我遇到的问题。基本上有两个问题。在我的配置的getter中,我在排序和过滤前一个集合后返回了一个新的可观察集合。 第二个主要问题:

 'This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread'

这是我最好的猜测,我将刷新功能更改为:

 private void Refresh()
    {
        try
        {
            List<ViewerConfiguration> newlyAddedFiles = GetConfigurations();
            //should not update on other thread than on main thread
            App.Current.Dispatcher.BeginInvoke((ThreadStart)delegate()
            {
                foreach (ViewerConfiguration config in newlyAddedFiles)
                {
                    Configurations.Add(config);
                }
            });
        }
        catch (Exception ex)
        {

        }
    }

现在,它的工作。 感谢