gpt4 book ai didi

c# - Caliburn Micro Datagrid 绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 20:44:57 25 4
gpt4 key购买 nike

我在 WPF 应用程序中使用 Caliburn Micro 框架,我需要将一个集合绑定(bind)到 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:当我运行该应用程序时,文本框获得正确的值,但数据网格尚未填充。在这里,我使用约定“ClassName_PropertyName”的深度属性绑定(bind)技术。

问题 2当我更改“名称”属性的值时NotifyOfPropertyChange(() => Person) 永远不会被调用。我想在 Name 字段中的文本更改时调用 guard 方法。

任何人都可以建议我一个简单的解决方案来克服这个问题吗?提前致谢。

最佳答案

Person类上实现PropertyChangedBase,然后对于Name我们可以这样写

private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
name = value;
NotifyOfPropertyChange(() => Name);
}
}

对于 DataGrid 的绑定(bind),不要使用“深度绑定(bind)”,只需使用

<DataGrid ItemsSource="{Binding Person.Subjects}" ...

希望对您有所帮助。

关于c# - Caliburn Micro Datagrid 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com