Caliburn Micro数据表格绑定

3
我可以帮助你翻译成中文。以下是需要翻译的内容:

我正在使用Caliburn Micro框架开发一个WPF应用程序,并且需要将一个集合绑定到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”。 问题2:当我改变“Name”属性的值时,“NotifyOfPropertyChange(() => Person)”从未被调用。我想在名称字段中的文本更改时调用警卫方法。
有人能建议我一个简单的解决方案来解决这些问题吗? 提前感谢您。
1个回答

6
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}" ...

我希望这可以帮到你。

有没有办法在子对象值更改时通知父对象?例如:当“Person.Name”的值更改时,如何通知“Person”类? - Rahul
你好,我已经从'Screen'类继承了Person类,并在属性'Name'上添加了NotifyOfPropertyChange(() => Parent)。但是当更改名称的值时,在ViewModel中从未调用NotifyOfPropertyChange(() => Person),有任何原因吗? - Rahul
我在这里误导了你。因为你想要引发父对象的属性更改事件,所以你需要考虑在 Person 上添加事件处理程序... - MoonKnight
谢谢,Killerc am。你能否提供一个简单的示例代码? - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接