[英]WPF, Caliburn Micro and Dapper - Datagrid Checkbox binding
[英]Caliburn Micro Datagrid Binding
我在WPF应用程序中使用Caliburn Micro框架,并且需要将集合绑定到DatGrid的ItemsSource。 请考虑以下代码:
类
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public ObservableCollection<Subject> Subjects;
}
public class Subject
{
public string Title{ get; set; }
}
查看模型
public class PersonViewModel : Screen
{
private Person _person;
public Person Person
{
get { return _person; }
set
{
_person = value;
NotifyOfPropertyChange(() => Person);
NotifyOfPropertyChange(() => CanSave);
}
}
....
}
视图
<UserControl x:Class="CalCompose.ViewModels.PersonView" ...ommited... >
<Grid Margin="0">
<TextBox x:Name="Person_Id" HorizontalAlignment="Left" Height="23" Margin="10,52,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="Person_Name" HorizontalAlignment="Left" Height="23" Margin="10,90,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<DataGrid ItemsSource="{Binding Person_Subjects}" Margin="10,177,0,0"></DataGrid>
</Grid>
</UserControl>
问题1:当我运行应用程序时,TextBoxes获得正确的值,但数据网格尚未填充。 在这里,我使用约定“ ClassName_PropertyName”的深度属性绑定技术。
问题2当我更改“名称”属性的值时,永远不会调用NotifyOfPropertyChange(()=> Person)。 当文本在“名称”字段中更改时,我想调用Guard方法。
谁能建议我一个简单的解决方案来克服这个问题? 提前致谢。
在Person
类上实现PropertyChangedBase
,然后对于Name
我们可以编写
private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
name = value;
NotifyOfPropertyChange(() => Name);
}
}
对于与DataGrid
的绑定,请不要使用“深度绑定”,而只需使用
<DataGrid ItemsSource="{Binding Person.Subjects}" ...
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.