Caliburn Micro Datagrid 绑定
Caliburn Micro Datagrid Binding
我在 WPF 应用程序中使用 Caliburn Micro 框架,我需要将集合绑定到 DatGrid 的 ItemsSource。
请考虑以下代码:
Class
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>
问题一:
当我 运行 应用程序时,文本框正在获取正确的值,但数据网格尚未填充。
在这里,我使用约定 "ClassName_PropertyName".
的深度 属性 绑定技术
问题 2
当我更改 'Name' 属性 的值时
NotifyOfPropertyChange(() => Person) 永远不会被调用。我想在 Name 字段中的文本更改时调用 guard 方法。
任何人都可以建议我一个简单的解决方案来解决这个问题吗?
提前致谢。
在 Person
class 上实现 PropertyChangedBase
,然后对于 Name
我们可以写
private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
name = value;
NotifyOfPropertyChange(() => Name);
}
}
对于 DataGrid
的绑定,不要使用 "deep binding",仅使用
<DataGrid ItemsSource="{Binding Person.Subjects}" ...
希望对您有所帮助。
我在 WPF 应用程序中使用 Caliburn Micro 框架,我需要将集合绑定到 DatGrid 的 ItemsSource。 请考虑以下代码:
Class
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>
问题一: 当我 运行 应用程序时,文本框正在获取正确的值,但数据网格尚未填充。 在这里,我使用约定 "ClassName_PropertyName".
的深度 属性 绑定技术问题 2 当我更改 'Name' 属性 的值时 NotifyOfPropertyChange(() => Person) 永远不会被调用。我想在 Name 字段中的文本更改时调用 guard 方法。
任何人都可以建议我一个简单的解决方案来解决这个问题吗? 提前致谢。
在 Person
class 上实现 PropertyChangedBase
,然后对于 Name
我们可以写
private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
name = value;
NotifyOfPropertyChange(() => Name);
}
}
对于 DataGrid
的绑定,不要使用 "deep binding",仅使用
<DataGrid ItemsSource="{Binding Person.Subjects}" ...
希望对您有所帮助。