c# - Caliburn.Micro MVVM WPF - 在用户编辑 DataGrid 时启用按钮,否则禁用它

标签 c# wpf mvvm caliburn.micro

我是 MVVM 和 Caliburn.Micro 的新手。

我已经实现了一个绑定(bind)到 <BindableCollection><CustomerModel> 的 DataGrid其中 CustomerModel 是:

    public class CustomerModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string StreetName { get; set; }
    public int HouseNumber { get; set; }
    public string ApartmentNumber { get; set; }
    public string PostalCode { get; set; }
    public string Town { get; set; }
    public int PhoneNumber { get; set; }
    public string DateOfBirth { get; set; }
    public int Age { get; set; }
}

此数据在启动时从 XML 文件加载,也可以通过单击连接到方法 SaveToXML() 和显然连接到 CanSaveToXML() 的按钮“保存”保存到 XML 文件中。保存和加载工作完美,但我只想在用户编辑 DataGrid 时启用“保存”按钮,否则它应该保持禁用状态。

我尝试将 CustomerModel 类的当前对象数与启动时 CustomerModel 的对象数进行比较。如果数字不同,它应该启用按钮,因为它表示有人输入或删除了一个条目。
        public bool CanSaveToXML()
    {
        if (CustomersOnStartup != Customers.Count())
            return true;
        else
            return false;
    }

在哪里
public BindableCollection<CustomerModel> Customers { get; set; }

问题是 Customers.Count() 仅执行一次,并且在启动和用户添加/删除条目后数字不会更新。我知道它可能与
NotifyOfPropertyChange(() => ???)

但我不知道如何使用它与 Customers.Count() 的对象数量相关

欢迎任何想法。

XAML 实现:
    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="20"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="20"/>

    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="20"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="20"/>
        <RowDefinition Height="20"/>
    </Grid.RowDefinitions>
    <DataGrid Grid.Row="1" Grid.Column="1" x:Name="Customers" AlternatingRowBackground="LightGray"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name" Width="auto" Binding="{Binding Path=FirstName, Mode=TwoWay}" />
            <DataGridTextColumn Header="Last Name" Width="auto" Binding="{Binding Path=LastName}" />
            <DataGridTextColumn Header="Street Name" Width="auto" Binding="{Binding Path=StreetName}" />
            <DataGridTextColumn Header="House Number" Width="auto" Binding="{Binding Path=HouseNumber}" />
            <DataGridTextColumn Header="Apartment Number" Width="auto" Binding="{Binding Path=ApartmentNumber}" />
            <DataGridTextColumn Header="Postal Code" Width="auto" Binding="{Binding Path=PostalCode}" />
            <DataGridTextColumn Header="Town" Width="auto" Binding="{Binding Path=Town}" />
            <DataGridTextColumn Header="Phone Number" Width="auto" Binding="{Binding Path=PhoneNumber}" />
            <DataGridTextColumn Header="Date of Birth" Width="auto" Binding="{Binding Path=DateOfBirth}" />
            <DataGridTextColumn Header="Age" Width="auto" Binding="{Binding Path=Age}" IsReadOnly="True"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button x:Name="SaveToXML" Content="Save" Grid.Column="1" Grid.Row="3" Width="50" HorizontalAlignment="Left"/>
</Grid>

最佳答案

如果要测试集合的计数,则必须使用它后面的属性:

    private int initcount;
    public YourViewModel()//constructor
    {
        RecordNbr = People.Count;
        initcount = RecordNbr;
    }

    //Property whixh follows the number of count
    private int _recordNbr;
    public int RecordNbr
    {
        get => _recordNbr;
        set
        {
            _recordNbr = value;
            NotifyOfPropertyChange(() => RecordNbr);
            NotifyOfPropertyChange(() => CanSaveToXML);
        }
    }

    public void SaveToXML()
    {

    }

    public bool CanSaveToXML
    {
        get => initcount == RecordNbr;
    }

    public void RemoveItem()
    {
       if (People.Count == 0) return;

        People.RemoveAt(0);
        RecordNbr = People.Count;
    }

关于c# - Caliburn.Micro MVVM WPF - 在用户编辑 DataGrid 时启用按钮,否则禁用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62011159/

相关文章:

c# - 这个振荡功能如何实现

c# - 测试角色是否属于 .net 中某个类别的最佳方法

.net - 数据重置后扩展器崩溃

c# - 在 ListView ItemTemplate 填充中制作网格

c# - 如何创建一个新线程来执行 Action<T>

c# - 正则表达式匹配两个字符之间的多个数字组

wpf - 包装面板未正确调整大小

c# - 将键盘快捷键绑定(bind)到 WPF View 模型中的命令

c# - MVVM 和依赖注入(inject)

mvvm - Silverlight DataGrid.BeginEdit()不会将单元格置于编辑模式