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 文件加载,也可以通过单击与方法 SaveTo[=43] 相关联的按钮 "Save" 保存到 XML 文件中=]() 显然是 CanSaveToXML()。保存和加载工作完美,但我只想在用户编辑 DataGrid 时启用 "Save" 按钮,否则它应该保持禁用状态。
我尝试将 CustomerModel class 的当前对象数与启动时 CustomerModel 的对象数进行比较。如果数字不同,它应该启用该按钮,因为它表明有人输入或删除了条目。
public bool CanSaveToXML()
{
if (CustomersOnStartup != Customers.Count())
return true;
else
return false;
}
哪里
public BindableCollection<CustomerModel> Customers { get; set; }
问题是 Customers.Count() 只执行一次,并且在启动和 adding/deleting 用户输入后数字不会更新。我知道它可能连接到
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;
}
我是 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 文件加载,也可以通过单击与方法 SaveTo[=43] 相关联的按钮 "Save" 保存到 XML 文件中=]() 显然是 CanSaveToXML()。保存和加载工作完美,但我只想在用户编辑 DataGrid 时启用 "Save" 按钮,否则它应该保持禁用状态。
我尝试将 CustomerModel class 的当前对象数与启动时 CustomerModel 的对象数进行比较。如果数字不同,它应该启用该按钮,因为它表明有人输入或删除了条目。
public bool CanSaveToXML()
{
if (CustomersOnStartup != Customers.Count())
return true;
else
return false;
}
哪里
public BindableCollection<CustomerModel> Customers { get; set; }
问题是 Customers.Count() 只执行一次,并且在启动和 adding/deleting 用户输入后数字不会更新。我知道它可能连接到
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;
}