在WPF中切换DataGrid的绑定源

时间:2011-08-01 12:35:16

标签: wpf data-binding datagrid

在我看来,有一个DataGrid,它的ItemsSource被绑定到3个不同文件夹的文件列表。

是否可以以编程方式切换绑定源?

E.g。首次点击ItemsSource="{Binding FileList}
并且第二次点击ItemsSource="{Binding FileList1}

这可能在同一个DataGrid中吗?我正在关注MVVM并使用Prism。

2 个答案:

答案 0 :(得分:1)

是的,可以在点击或其他一些操作上更改数据上下文。 你说你正在使用MVVM棱镜......这是我创建的一个样本来帮助你..

在此示例中,我的源代码(在您的情况下是datagrid)itemssource属性将始终绑定到属性“Sourcelist”,并且单击我将源列表分配给不同的列表。 所以在每次点击时我们都会重新分配绑定到datagrid或list

的sourcelist属性
class Viewmodel : ViewModelBase
    {
        public Viewmodel()
        {
            ChangeDataSource = new DelegateCommand<object>(ChagneDataSource);
            Filelist1 = new FileListOne();
            FileList2 = new FileListTwo();
            Filelist1.Files = new List<string>();
            FileList2.Files = new List<string>();
            for (int i = 0; i < 10; i++)
            {
                Filelist1.Files.Add("FileListOne " + i);
                FileList2.Files.Add("FileListTwo " + i);
            }

            Sourcelist = Filelist1;
        }

        private object _sourcelist;

        public object Sourcelist
        {
            get
            {
                return _sourcelist;
            }
            set
            {
                _sourcelist = value;
                OnPropertyChanged("Sourcelist");
            }
        }


        public ICommand ChangeDataSource { get; set; }

        public FileListOne Filelist1 { get; set; }

        public FileListTwo FileList2 { get; set; }

        private void ChagneDataSource(object seder)
        {
            if (Sourcelist.GetType() == typeof(FileListOne))
                Sourcelist = FileList2;
            else
                Sourcelist = Filelist1;
        }
    }

    class FileListOne
    {
        public List<string> Files { get; set; }
    }


    class FileListTwo
    {
        public List<string> Files { get; set; }
    }

XAML

<StackPanel>
        <ListBox x:Name="listbox2" ItemsSource="{Binding Sourcelist.Files}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button x:Name="button" Content="Button" Command="{Binding ChangeDataSource}"/>

    </StackPanel>

答案 1 :(得分:0)

那些XAML片段只是转换为

dataGrid.SetBinding(DataGrid.ItemsSourceProperty, new Binding("FileList"));

您需要跟踪字段中发生的点击次数,当然还需要引用DataGrid。 (您可以通过x:Reference创建一个并将其存储在Button的TagCommandParameter中,如果您使用的命令更可能是MVVM我认为的那样)