gpt4 book ai didi

c# - 单击WPF Caliburn.Micro中的按钮时无法在DataGrid中全选

转载 作者:行者123 更新时间:2023-12-03 10:17:20 24 4
gpt4 key购买 nike

我试图弄清楚如何 bind一个 button选择所有 rows (项目)在 DataGrid使用 MVVM (Caliburn.Micro)。

我希望将此按钮与 DataGrid 分开。本身。

就像是:

看法:

<Button x:Name="SelectAll"/>

<DataGrid x:Name="People">

<DataGrid.RowStyle>
<Style>
<Setter Property="DataGridRow.IsSelected"
Value="{Binding IsPersonSelected}" />
</Style>
</DataGrid.RowStyle>

<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding PersonName, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>

</DataGrid>

View 模型:
public bool _isPersonSelected = false;

public bool IsPersonSelected
{
get { return _isPersonSelected; }
set
{
_isPersonSelected = value;
NotifyOfPropertyChange(() => IsPersonSelected);
}
}

public void SelectAll()
{
if(IsPersonSelected == true)
{
IsPersonSelected = false;
}
else
{
IsPersonSelected = true;
}
}

但这不起作用,也许还有另一种方法可以在 DataGrid 中选择行对 MVVM 使用某种绑定(bind)?

或以某种方式调用 SelectAllCommand RoutedUICommand对于 DataGrid年代?

建议/帮助将不胜感激。

最佳答案

我没有看到你对类和模型的定义,所以我想你有 IsPersonSelected 是你类的属性吗?你试试

public class PersonModel:PropertyChangedBase
{
:
:
public bool IsPersonSelected
{
get => _isPersonSelected;
set
{
_isPersonSelected = value;
NotifyOfPropertyChange(() => IsPersonSelected);
}
}
}

<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsPersonSelected, Mode=TwoWay}"/>
</Style>
</DataGrid.RowStyle>

使用 SelectAll() 之后

你做 :
    public  void SelectAll()
{
foreach(var p in People)
if(p.IsPersonSelected)
//DO something
{

如果您选择多行,您可以看到该行的值为 true
在您可以通过修改 IsPersonSelected 的值来更改选择,但不突出显示数据网格的相应行之后,属性 IsSelected 不会重现所选行的突出显示,为此,这是另一个问题(使用 VisualHelper)。要重现程序选择的行的突出显示,它有点复杂,需要更改您的编码,并且需要有完整的代码 wpf。

不使用属性 IsSelected 选择多行的另一种方法:

添加 xmlns:cal="http://www.caliburnproject.org"
    <DataGrid x:Name="People" cal:Message.Attach="[Event SelectionChanged] = [Row_SelectionChanged($eventArgs)]">

在您的 View 模型中:
    public void Row_SelectionChanged(SelectionChangedEventArgs obj)
{
//(obj.OriginalSource as DataGrid).SelectedIndex gives you the index of row selected
_selectedObjects.AddRange(obj.AddedItems.Cast<PersonModel>());
obj.RemovedItems.Cast<PersonModel>().ToList().ForEach(w => _selectedObjects.Remove(w));
}
List<PersonModel> _selectedObjects = new List<PersonModel>();
public PersonModel SelectedPeople { get; set; } //Will be set by Caliburn Micro automatically (name convention)

每次选择一行时,它都会添加到列表中,使用 ctrl 您可以添加更多行或取消选择一个。每个事件都会修改列表的内容..(对不起我的英语,希望你能理解)。仅供引用,使用 caliburn,您可以访问名称约定,因此就像您的数据网格被命名为 People,选择的第一行自动绑定(bind)到 SelectedPeople

关于c# - 单击WPF Caliburn.Micro中的按钮时无法在DataGrid中全选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61731405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com