簡體   English   中英

Caliburn.Micro MVVM WPF - 在用戶編輯 DataGrid 時啟用按鈕,否則禁用它

[英]Caliburn.Micro MVVM WPF - enable a button when DataGrid has been edited by the user, otherwise disable it

我是 MVVM 和 Caliburn.Micro 的新手。

我已經實現了一個綁定到<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 class 的當前對象數與啟動時 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM