2011-10-21 46 views
3

上一个DataGrid结合我有我使用双向在WPF

var allLines = from Lines in ctx.InvoiceLines join PerPs in ctx.ProductsViews on Lines.ProductCode equals PerPs.ProductCode 
       where (Lines.BranchNo == BrNo) && (Lines.Docket == Docket) 
       select new { Lines.ProductCode, Lines.Description, Lines.Inv_Quantity, Lines.Grn_Quantity, 
       Lines.Inv_Price,Lines.Grn_Price,Lines.Inv_Total, Lines.Grn_Total, Lines.AnalCode, 
       Lines.Vat_Rate, Lines.GrnNo,Lines.Comment , PerPs.OuterUnits}; 

dgGrid.ItemsSource = allLines; 

我想用双向绑定更新数据库时的任何值被改变或者新的行填充一个WPF的DataGrid被添加。那可能吗?

我的XAML代码是

<DataGrid Grid.Row="3" x:Name="dgGrid" DataContext="{Binding}" FontSize="16" HorizontalScrollBarVisibility="Visible" 
       VerticalScrollBarVisibility="Visible" SelectionUnit="FullRow" SelectionMode="Extended" AutoGenerateColumns="False" 
       SelectionChanged="dgGrid_SelectionChanged" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="250" Header="Description" Binding="{Binding Description, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" FontSize="14"/> 
      <DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="63" Header="Grn_Quantity" Binding="{Binding Grn_Quantity, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="59" Header="Inv_Price" Binding="{Binding Inv_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="61" Header="Ord_Price" Binding="{Binding Grn_Price, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="72" Header="Inv_Total" Binding="{Binding Inv_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="74" Header="Grn_Total" Binding="{Binding Grn_Total, Converter={StaticResource Currency}, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="58" Header="AnalCode" Binding="{Binding AnalCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="40" Header="Vat_Rate" Binding="{Binding Vat_Rate, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="Auto" Header="GrnNo" Binding="{Binding GrnNo, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="Auto" Header="Comment" Binding="{Binding Comment, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Width="Auto" Header="PerP" Binding="{Binding OuterUnits}" IsReadOnly="True"/> 
     </DataGrid.Columns> 
     <DataGrid.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSteelBlue"/> 
     </DataGrid.Resources> 
    </DataGrid> 

当我运行这段代码所有,但PERP栏是空的。

我很迷茫,如何做到最好的方式,所以任何帮助将非常感激。

回答

3

所有BindingsDataGridTextColumn除了“PERP”列中两次指定的路径。例如:

<DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode, Mode=TwoWay, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/> 

这里您Binding首先指定路径是“产品代码”,然后同时指定它是“IsSelected”。由于集合中绑定到网格的对象中没有“IsSelected”属性,因此如果在调试器下运行该属性,则应该在“输出”窗口中看到绑定错误。如果删除那些绑定的Path=IsSelected,则应该正确绑定列值。

您的数据源是匿名类型的集合,因此var是必需的,但是正如其他人所说的,对该集合的双向绑定不适用于更新回源。

+0

是否有另一种方法可以支持更新的双向绑定? – Noelle

+1

是的,通过绑定到你想要更新的实际对象的实例,在你的情况下这将是由实体框架跟踪的实体。我假设你最终想要将更改保存回数据库,因此更新会影响正在进行更改跟踪的EF实体,这样以后所有更改都可以刷新到数据库。 –

+0

你有链接到任何网站,可以显示如何做到这一点? – Noelle

2

如果“allLines”变量是DataTable,那么可以将DataGrid的AutoGenerateColumns设置为true。
您也不需要使用“DataContext”属性,而是使用“ItemsSource”。
事情是这样的:

<DataGrid ItemsSource="{Binding Path=allLines.DefaultView}" ... /> 

要在更改更新回数据库,调用一个“保存”按钮,点击比如你的DataTable的Update()方法。

如果“allLines”不是一个DataTable,然后删除这个地狱般的“变种”关键字,告诉我们变量的本色=)

+0

当我使用ItemsSource DG是空的。我不知道什么数据类型allLines实际上是 – Noelle

+1

TBH它从代码中很清楚地看到,赋值左侧的变量不是一个DataTable,因此不相关。这显然是一个匿名类型的集合,所以var是必需的。 –

2

allLines变量是一个匿名类型的枚举。在C#中匿名类型是只读的 - 属性不能被编辑,并且更改不能被保存。

请尝试将查询:

var allLines = 
    from Lines in ctx.InvoiceLines 
    join PerPs in ctx.ProductsViews on Lines.ProductCode equals PerPs.ProductCode 
    where (Lines.BranchNo == BrNo) && (Lines.Docket == Docket) 
    select Lines; 

dgGrid.ItemsSource = allLines.ToList(); 
+0

如何使其可读(不是匿名)? – Noelle

+1

除了将查询结果投影到匿名类型的集合(即使用'new {...}')之外,因为Paul应该跟踪对它们所做的更改,所以请选择上面显示的实际行。 –