2015-11-13 297 views
0

我度过了最后三天努力使这项工作,我真的不知道如何做到这一点,总之:XAML绑定问题

<Grid DataContext="{Binding Path=Transaccion}"> 
    <DataGrid Name="tr" AutoGenerateColumns="False" ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Fecha" Binding="{Binding Path=Transaccion.Fecha}" /> 
     </DataGrid.Columns> 
     <DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="120"/> 
         <ColumnDefinition Width="70"/> 
         <ColumnDefinition Width="70"/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Path=SubRubro.Nombre}"/> 
        <TextBlock Grid.Column="1" Text="{Binding Path=Monto}"/> 
        <TextBlock Grid.Column="2" Text="{Binding Path=TipoTransaccion}"/> 
       </Grid> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
</Grid> 

Transacciones POCO具有通过DetallesTransaccion引用的主键(交易详情)在他的Transaccion_Id列中,这个XAML我希望所有引用DetallesTransaccion的引用出现在rowDetails中的相同Transaccion_Id,现在只出现一个,每个Transaccion。然后,我还有一个问题,就是有关数据绑定也是一样,我不能得到它的工作之一:

[Table("SubRubro")] 
public class SubRubro 
{ 
    public int Id { get; set; } 

    public string Codigo { get; set; } 

    public string Nombre { get; set; }   

    public int? ParentId { get; set; }   

    public virtual SubRubro Parent { get; set; } 
} 

ALL SubRubros必须在parentId列自我参照表,所有SubRubro■找一个直接父母,我不能让这个我都试过了,HierarchicalDataTemplateDataTemplate的可视化表示,这里是我的表行的例子:

ID CODE  NAME    PARENTID 

1 10.1  SubRubro 0   NULL(Dont have parent) 
21 10.1.1 SubRubro anidado 0 1 
22 10.1.2 SubRubro anidado 1 1 
23 10.1.3 SubRubro anidado 2 1 
24 10.1.1.1 SubRubro anidado 3 21 
25 10.1.1.2 SubRubro anidado 4 21 

你能告诉我吗?

编辑 这是我的交易类:

public partial class Transaccion 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Transaccion() 
    { 
     DetallesTransaccion = new HashSet<DetallesTransaccion>(); 
    } 

    public int Id { get; set; } 

    [Column(TypeName = "date")] 
    public DateTime Fecha { get; set; } 

    [StringLength(50)] 
    public string Descripcion { get; set; } 

    public int AutorizaId { get; set; } 

    public int ConfeccionaId { get; set; } 

    public int CentroCostoId { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<DetallesTransaccion> DetallesTransaccion { get; set; } 

    public virtual Usuario Autoriza { get; set; } 

    public virtual Usuario Confecciona { get; set; } 
} 

交易明细:

public partial class DetallesTransaccion 
{ 
    public int Id { get; set; } 

    public int TransaccionId { get; set; } 

    public int SubRubroId { get; set; } 

    public decimal? Monto { get; set; } 

    public TipoTransaccion TipoTransaccion { get; set; } 

    public virtual SubRubro SubRubro { get; set; } 

    public virtual Transaccion Transaccion { get; set; } 
} 

public enum TipoTransaccion 
{ 
    Debita = 0, 
    Acredita = 1 
} 

视图模型:(测试)

private NeotekDB ctx = new NeotekDB(); 

    public List<DetallesTransaccion> Transaccion 
    { 
     get { return ctx.DetallesTransaccion.Include("Transaccion").ToList(); } 
    } 

    public List<Transaccion> Detalles 
    { 
     get { return ctx.Transacciones.Include("DetallesTransaccion").ToList(); } 
    } 

两个查询是相同的,但不同的切入点,尝试看看是否有差异,但没有。 EDIT 2 我得到这个:THIS

我想这一点:Want this

+0

遵循一些MVVM WPF教程,你会得到它的窍门。您需要通知您更新的视图 - INotifyPropertyChanged和ObservableableCollection对此非常有用 - 并且您需要为控件设置正确的'DataContext'。另外,我的交易类是什么样的?我有一种感觉,你的'ItemsSource'绑定不正确。 – Kcvin

+0

我无法在应用程序启动后显示所需的值,与INPC无关 –

+1

请接受我的建议。你的ItemsSource应该绑定到'ObservableCollection '这样的东西,你应该添加项目。如果数据在应用程序启动之前就存在,并且您没有添加/删除,则需要在调用MainWindow的InitializeComponent()之前设置您的DataContext。 – Kcvin

回答

1

的第一步将是您的数据解析成一组对象的准确代表您的数据层次。

根据您想要的行为或外观类型,有两种方法可以做到这一点。

要么解析成单独TransactionTransactionDetail对象,象下面这样:

public class Transaction 
{ 
    // all properties related to Transaction 
    public int TransaccionId { get; set; } 
    public DateTime Fecha { get; set; } 
    public string Descripcion { get; set; } 
    public int AutorizaId { get; set; } 
    public int ConfeccionaId { get; set; } 
    public int CentroCostoId { get; set; } 
    public Usuario Autoriza { get; set; } 
    public Usuario Confecciona { get; set; } 

    // A list of the transaction detail objects for this transaction 
    public List<TransactionDetail> TransactionDetails { get; set; } 
} 

public class TransactionDetail 
{ 
    // all properties related to transaction detail record 
    public int TransactionDetailId { get; set; } 
    public decimal? Monto { get; set; } 
    public TipoTransaccion TipoTransaccion { get; set; } 
    public string Codigo { get; set; } 
    public string Nombre { get; set; } 

    // this could also be a Transaction object if needed 
    public int ParentTransactionId { get; set; } 
} 

和你List<Transactions>有一个DataGrid使用DataGridTemplateColumn但要绘制的TransactionDetails的列表画(ItemsControl中,列表框等) 。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Transactions}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="TransaccionId" Binding="{Binding TransaccionId}" /> 
     <DataGridTextColumn Header="Fecha" Binding="{Binding Fecha}" /> 
     <DataGridTextColumn Header="Descripcion" Binding="{Binding Descripcion}" /> 

     <DataGridTemplateColumn Header="Details"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ListBox ItemsSource="{Binding TransactionDetails}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

或可替代汇整对象,因此每个对象都包含了一整套既TransactionDetailTransaction数据,而你的DataGrid的分组设置为基于TransactionId组。然后

网格您的数据对象会是这个样子:

public class TransactionDetail 
{ 
    // all properties related to Transaction 
    public int TransaccionId { get; set; } 
    public DateTime Fecha { get; set; } 
    public string Descripcion { get; set; } 
    public int AutorizaId { get; set; } 
    public int ConfeccionaId { get; set; } 
    public int CentroCostoId { get; set; } 
    public Usuario Autoriza { get; set; } 
    public Usuario Confecciona { get; set; } 

    // all properties related to transaction detail record 
    public int TransactionDetailId { get; set; } 
    public int ParentTransactionId { get; set; } 
    public decimal? Monto { get; set; } 
    public TipoTransaccion TipoTransaccion { get; set; } 
    public string Codigo { get; set; } 
    public string Nombre { get; set; } 
} 

而且你的XAML可能会类似于this MSDN example东西。 (对不起,不想在这里写出来,虽然有很多DataGrid Grouping的例子)。

该类也可能简化为使用Transaction对象,并在数据绑定中使用ParentTransaction.X

public class TransactionDetail 
{ 
    // all properties related to transaction detail record 
    public int TransactionDetailId { get; set; } 
    public decimal? Monto { get; set; } 
    public TipoTransaccion TipoTransaccion { get; set; } 
    public string Codigo { get; set; } 
    public string Nombre { get; set; } 

    // all properties related to Transaction 
    public Transaction ParentTransaction { get; set; } 
} 
+0

Rachel,谢谢你的回答!我知道了。哪种解析方法更好?(例如,出于性能考虑)。我应该在LINQ查询中解析来自数据库的数据并返回2个新对象(Transaction2,TransactionDetails2),我应该使用相同的对象。最后我看到你拿出了: DetallesTransaccion = new HashSet (); 为什么?和ICollection ?.他们不工作绑定?或者我的POCOS中有一个糟糕的设计?再次感谢 –

+0

使用我的POCOS无法绑定到每个交易分组详细信息=(,不能输入交易详情或任何属性,我失去了绑定在列表框 –

+0

@LuchoMansilla这取决于你打算用UI做什么 - 我个人更喜欢第一种选择,除非我有特殊的要求,这会使其他选项更好,比如分组数据摘要,选择行为等等。至于要使用哪些数据对象,这也取决于你在做什么。数据发生变化时,您需要确保您的对象模型实现INotifyPropertyChanged。如果您计划对动态添加/删除的详细记录,则需要确保使用ObservableCollection而不是List或ICollection。 – Rachel