在我看来,有一个DataGrid,它的ItemsSource
被绑定到3个不同文件夹的文件列表。
是否可以以编程方式切换绑定源?
E.g。首次点击ItemsSource="{Binding FileList}
并且第二次点击ItemsSource="{Binding FileList1}
这可能在同一个DataGrid中吗?我正在关注MVVM并使用Prism。
答案 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的Tag
或CommandParameter
中,如果您使用的命令更可能是MVVM我认为的那样)