【发布时间】:2019-03-15 14:46:46
【问题描述】:
我正在使用 DevExpress XAML 框架。在我的网格中,我有 CheckBoxSelectorColumn,它是随框架提供的(我找到的进行多项选择的最简单方法)。
我不能使用绑定来获取 SelectedItems,而是在我的 main.xaml.cs 中使用 [gridName].SelectedItems。
有没有办法将 SelectedItems 传递给 MainViewModel?
[编辑]
很抱歉,我的问题不清楚且没有代码示例。 我将提供我的部分代码。
MyUserControl.xaml
<dxg:GridControl Name="grid" SelectionMode="MultipleRow" AutoGenerateColumns="None" EnableSmartColumnsGeneration="false" ItemsSource="{Binding BugList}" Margin="0,0,0,20" Grid.RowSpan="2">
<dxg:GridControl.View>
<dxg:TableView
AllowEditing="False" ShowCheckBoxSelectorColumn="True"
HorizontalScrollbarVisibility="Auto"
/>
</dxg:GridControl.View>
<dxg:GridColumn FieldName="Description" Header="Description"/>
我使用ShowCheckBoxSelectorColumn 属性在每行中获取一个带有复选框的列以进行多选。
该属性的缺点,同时也有一个好处,就是选定的项目不能通过绑定传递(如果我的研究是正确的),但它们可以通过以下方式轻松传递到视图后端:
MyUserControl.xaml.cs
public void EntriesHandle_Button()
{
if (grid.SelectedItems.Count != 0)
{
if (DXMessageBox.Show("Do you really want to remove selected Items from your List?", "Question",
MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
//remove selected entries
}
}
else { MessageBox.Show("Please select entries", "Warning"); }
}
使用grid.SelectedItems,我可以在视图的 checkboxColumn 中获得这些项目。
我想将 SelectedItems 传递给 ViewModel,以便从 RibbonComponent 中的 Button 访问它们。那是我的问题。
[解决方案]
我使用 DevExpress.Mvvm.Messenger 从 RibbonControl 调用 EntriesHandle_Button():
ribbon.xaml
<dxb:BarButtonItem Name="BRemove" Content="Remove selected">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:EventToCommand EventName="ItemClick" Command="{Binding RemoveEntries_OnClick}"/>
</dxmvvm:Interaction.Behaviors>
</dxb:BarButtonItem>
RibbonViewModel.cs
public class RibbonViewModel : ViewModelBase
{
private readonly IRibbonCommands _ribbonCommands;
public RibbonViewModel(IRibbonCommands ribbonCommands)
{
_ribbonCommands = ribbonCommands;
RemoveEntries_OnClick = new DelegateCommand(_ribbonCommands.RemoveEntries);
}
RibbonCommands.cs
public class RibbonCommands : IRibbonCommands
{
public void RemoveEntries()
{
string message = "remove";
Messenger.Default.Send(message);
}
}
MyUserControl.xaml.cs
public partial class MyUserControl: UserControl
{
public MyUserControl()
{
InitializeComponent();
DataContext = new MyUserControlViewModel();
Messenger.Default.Register<string>(this, EntriesHandle_Button);
}
public void EntriesHandle_Button(string message)
{
if (grid.SelectedItems.Count != 0)
{
switch (message)
{
case "remove":
if (DXMessageBox.Show("Do you really want to remove selected Items from your List?", "Question",
MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
//remove selected entries
}
break;
}
}
else { MessageBox.Show("Please select entries", "Warning"); }
}
}
【问题讨论】:
-
我认为是这样的,我没有使用 DevExpress。 stackoverflow.com/a/22392637/3225
-
Main.xaml 的 DataContext 是否设置为您的 MainViewModel?也许您可以在 Main.xaml.cs 中执行
(DataContext as MainViewModel).YourSelectedItemsProperty = [gridName].SelectedItems。然而,适当的 MVVM 解决方案会更好;) -
如果它是一个合适的 MVVM,那么您可以为每个项目提供具有
IsSelected属性的视图模型。该属性可以由视图设置,甚至可以直接绑定到其他一些控制属性(我不使用 DevExpress),就像它通常为ListViewItem(example) 所做的那样。 -
请考虑提供minimal reproducible example。另外不要忘记阅读How to Ask 一个好问题。
-
可以将 SelectedItems 绑定到您的 ViewModel,您需要使用 ObservableCollection
标签: c# wpf xaml devexpress