我有一个启用多选的数据网格。我需要改变viewmodel中的选择。但是,SelectedItems属性是只读的,不能直接绑定到视图模型中的属性。那么,我如何向观点表明选择已经改变?WPF DataGrid多选选项绑定
回答
我还没有使用DataGrid
很多,但一种适用于ListView
的技术是绑定到个人ListViewItem
的IsSelected
属性。只需为列表中的每个对象设置为true
,然后它就会被选中。
也许代表DataGrid
中的一行的对象也具有IsSelected
属性,并且可以以这种方式使用?
安迪是正确的。 DataGridRow.IsSelected是一个依赖属性,可以通过数据绑定来控制ViewModel中的选择。下面的示例代码演示了这一点:
<Window x:Class="DataGridMultiSelectSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tk="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
Title="Window1" Height="300" Width="300">
<StackPanel>
<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" EnableRowVirtualization="False">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="Value" Binding="{Binding Value}" />
</tk:DataGrid.Columns>
<tk:DataGrid.RowStyle>
<Style TargetType="tk:DataGridRow">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</tk:DataGrid.RowStyle>
</tk:DataGrid>
<Button Content="Select Even" Click="Even_Click" />
<Button Content="Select Odd" Click="Odd_Click" />
</StackPanel>
</Window>
using System.ComponentModel;
using System.Windows;
namespace DataGridMultiSelectSample
{
public partial class Window1
{
public Window1()
{
InitializeComponent();
DataContext = new[]
{
new MyViewModel {Value = "Able"},
new MyViewModel {Value = "Baker"},
new MyViewModel {Value = "Charlie"},
new MyViewModel {Value = "Dog"},
new MyViewModel {Value = "Fox"},
};
}
private void Even_Click(object sender, RoutedEventArgs e)
{
var array = (MyViewModel[]) DataContext;
for (int i = 0; i < array.Length; ++i)
array[i].IsSelected = i%2 == 0;
}
private void Odd_Click(object sender, RoutedEventArgs e)
{
var array = (MyViewModel[])DataContext;
for (int i = 0; i < array.Length; ++i)
array[i].IsSelected = i % 2 == 1;
}
}
public class MyViewModel : INotifyPropertyChanged
{
public string Value { get; set; }
private bool mIsSelected;
public bool IsSelected
{
get { return mIsSelected; }
set
{
if (mIsSelected == value) return;
mIsSelected = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
一定要设置EnableRowVirtualisation="False"
DataGrid的元素,否则有一个风险,即IsSelected绑定掉出良好状态的。
完美。并感谢示例代码 - 很好地说明了它。 – 2011-05-17 08:49:29
谢谢。希望你不介意我在你的例子中加入'EnableRowVirtualisation =“False”',因为没有它,就会出现绑定不在新行上的错误。 – 2012-11-22 16:51:04
伙计们,感谢您的帮助。我的问题解决了。我认为这个问题对于新的WPF开发人员来说很常见,所以我会在这里重申我的问题以及更详细的解决方案,以防其他人遇到同样的问题。
问题:我有一个多选音频文件启用数据网格。网格有多个列标题。用户可以多选几行。当他点击播放按钮时,音频文件将按照列标题(例如列A)的顺序播放。播放开始时,多重选择被清除,只有当前播放的文件被高亮显示。当所有文件的播放结束时,多重选择将被重新显示。播放是在视频模型中完成的。如您所见,这里有两个问题:1)如何从视图模型中选择当前正在播放的文件,以及2)如何从视图模式向视图发信号表示播放已完成并重新显示多重选择。
解决方案:要解决第一个问题,我在viewmodel中创建了一个属性,该属性绑定到视图的SelectedIndex属性以选择当前正在播放的文件。为了解决第二个问题,我在视图模型中创建了一个布尔属性来指示播放完成。在后面的代码中,我订阅了布尔属性的PropertyChanged事件。在事件处理程序中,视图的SelectedItems属性从保存的多选中重新创建(SelectedItems的内容已保存到列表中,SelectedItems在播放开始时被清除)。起初,我无法重新创建SelectedItems。事实证明,问题是由于通过第二个线程发起的重新创建。 WPF不允许这样做。解决方法是使用Dispatcher.Invoke()让主线程完成工作。对于有经验的开发人员来说,这可能是一个非常简单的问题,但对于新手来说,这是一个小挑战。无论如何,来自不同人的很多帮助。
只需在任何MultiSelector派生类上使用SelectedItems,并使用方法Add,Remove,Clear就可以返回IList。
问候, 罗宾
- 1. WPF:与多选项绑定列表框
- 2. WPF Datagrid - RowDetails绑定到可选属性?
- 3. WPF tetbox绑定选项
- 4. 获取DataGrid中选定的行项WPF
- 5. 在WPF DataGrid中选定的项目
- 6. WPF分组嵌套在数据绑定选项卡中的DataGrid
- 7. WPF DataGrid绑定
- 8. WPF datagrid多行选择
- 9. 所选项目不与选定项目同步 - WPF DataGrid
- 10. WPF可选绑定
- 11. wpf datagrid当前项目绑定
- 12. WPF DataGrid绑定到ItemsSource项目属性
- 13. 绑定控制值选择DataGrid中值
- 14. 自定义复选框在WPF DataGrid不更新绑定
- 15. WPF DataGrid ClipboardBinding可能的多重绑定?
- 16. WPF DataGrid筛选器
- 17. 的DataGrid行选定项目
- 18. 防止将选项卡放入WPF DataGrid
- 19. WPF Datagrid获取所选项目
- 20. wpf datagrid专注于选择项目
- 21. WPF与DataGrid中删除所选项目
- 22. TextBlock绑定到选定的DataGrid元素
- 23. WPF多选列表框和复合项目源绑定
- 24. WPF DataGrid - 高亮选中的行,即使SelectedItem是绑定属性
- 25. WPF DataGrid:禁用多列选择
- 26. WPF Toolkit DataGrid多选:如何获取SelectedItems?
- 27. DataGrid虚拟化干扰绑定项目选择
- 28. 复选框绑定WPF
- 29. WPF DataGrid绑定DataGridCell内容
- 30. WPF DataGrid的绑定问题
参见http://stackoverflow.com/questions/1579700/wpf-toolkit-datagrid-multi-select-how-to-get-selecteditems-out – 2012-11-21 14:49:39