Caliburn Micro Datagrid绑定

时间:2015-02-26 07:35:11

标签: c# wpf binding datagrid caliburn.micro

我在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 当我更改'Name'属性的值时 永远不会调用NotifyOfPropertyChange(()=&gt; Person)。我希望在名称字段中更改文本时调用guard方法。

有人能建议我一个简单的解决方案来克服这个问题吗? 提前谢谢。

1 个答案:

答案 0 :(得分:4)

PropertyChangedBase课程上实施Person,然后在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}" ...

我希望这会有所帮助。