WPF DataGrid绑定不适用于caliburn micro

时间:2013-03-24 16:56:15

标签: wpf binding datagrid caliburn.micro caliburn

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

这是我的班级

public class Article : Screen
{
    public string Code { get; set; }
    public string Description{ get; set; }
    public decimal Cost{ get; set; }
    public decimal Price{ get; set; }
}

这是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"/>

这是我的viewmodel

[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");
    }    
}

为什么DATAGRID不工作?

4 个答案:

答案 0 :(得分:5)

要在 Caliburn.Micro 中启用绑定约定,通常在XAML中使用x:Name属性。如果您不是将List属性明确绑定到ItemsSource的{​​{1}},而是使用如下的名称约定:

DataGrid

我相信随后的绑定应该可以正常工作。

哦,你还需要将<DataGrid x:Name="List" Height="211" HorizontalAlignment="Left" Margin="12,31,0,0" VerticalAlignment="Top" Width="521" AutoGenerateColumns="False"> 作为属性而不是字段:

List

如果您想确保对public List<Article> List { get; private set; } 的修改在您的数据网格中得到正确反映,您还应该将List属性设为List并带有支持字段:

IObservableCollection

答案 1 :(得分:1)

a)您是否设置了DataContext?

b)尝试“Binding =”{Binding Code}“(没有Path =),对我来说很好。

答案 2 :(得分:0)

对于我的UWP应用,我发现x:Name约定不起作用,我需要使用可绑定的集合并将其直接绑定到ItemsSource。然后,我使用Path = PropertyName指定列。

XAML:

<controls:DataGrid Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="3"  ItemsSource="{Binding RawCSVData}" AutoGenerateColumns="false">
        <controls:DataGrid.Columns>
            <controls:DataGridTextColumn Header="Time" Binding="{Binding Path=Time}"/>
            <controls:DataGridTextColumn Header="Signal" Binding="{Binding Path=Signal}"/>
            <controls:DataGridTextColumn Header="Response" Binding="{Binding Path=Response}"/>

        </controls:DataGrid.Columns>
    </controls:DataGrid>

CSVData.cs:

public class CSVData: Screen
{
    public double Time { get; set; }
    public double Signal { get; set; }
    public double Response { get; set; }
}

ViewModel.cs代码段:

public BindableCollection<CSVData> RawCSVData { get; set; }

答案 3 :(得分:-1)

     private void _bookeditpage_ConfirmBook(Book _book, bool _isnewone) 
     {
        if (_isnewone)
        {
            Books.Add(_book);
        }
        else
        {
            //doesn't refresh datagrid
            SelectedBook = _book;
            //

            //works fine :)

            SelectedBook.BookName = _book.BookName;
            SelectedBook.IsPrenum=_book.IsPrenum;
            SelectedBook.Publisher=_book.Publisher;

           //
        }
    }