2015-11-13 290 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