WPF DataGrid绑定不适用于caliburn micro

put*_*i26 1 wpf binding datagrid caliburn caliburn.micro

我无法理解为什么它不起作用..

这是我的班级

public class Article : Screen
{
    public string Code { get; set; }
    public string Description{ get; set; }
    public decimal Cost{ get; set; }
    public decimal Price{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是DataGrid的XAML代码:

    <DataGrid Height="211" HorizontalAlignment="Left" 
        Margin="12,31,0,0" VerticalAlignment="Top" Width="521" 
        AutoGenerateColumns="False" ItemsSource="{Binding List}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Code}" Header="Code" />
            <DataGridTextColumn Binding="{Binding Path=Description}" Header="Description" />
            <DataGridTextColumn Binding="{Binding Path=Cost}" Header="Cost" />
            <DataGridTextColumn Binding="{Binding Path=Price}" Header="Price" />
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Button" Height="39" HorizontalAlignment="Left" 
            Margin="223,262,0,0" VerticalAlignment="Top" Width="110"
            x:Name="AllArticles"/>
Run Code Online (Sandbox Code Playgroud)

这是我的观点模型

[Export(typeof(IShell))]
public class ArtsViewModel : Screen
{
    public List<Article> List = new List<Article>();

    public void AllArticles()
    {
        Recover recover = new Recover();  //a model called Recover
        List = recover.Import().Articles; //return a List of Article
        NotifyOfPropertyChange("List");
    }    
}
Run Code Online (Sandbox Code Playgroud)

为什么DATAGRID不工作?

And*_*son 6

要在Caliburn.Micro中启用绑定约定,通常x:Name 在XAML中使用该属性.如果是你,而不是明确地结合的List财产ItemsSource你的DataGrid,使用的名称约定如下:

<DataGrid x:Name="List" Height="211" HorizontalAlignment="Left" 
    Margin="12,31,0,0" VerticalAlignment="Top" Width="521" 
    AutoGenerateColumns="False">
Run Code Online (Sandbox Code Playgroud)

我相信随后的绑定应该按照需要工作.

哦,你还需要创建List一个属性而不是字段:

public List<Article> List { get; private set; }
Run Code Online (Sandbox Code Playgroud)

如果要确保List在数据网格中正确反映修改,则还应使您的List属性IObservableCollection具有支持字段:

private IObservableCollection<Article> _list;
public IObservableCollection<Article> List { 
    get { return _list; }
    set {
        _list = value;
        NotifyOfPropertyChange(() => List);
    }
}
Run Code Online (Sandbox Code Playgroud)