MaxWidth="{Binding ElementName=grdRoot, Path=ActualWidth}"
; Public Function Clone(Of t As EntityObject)(entity As t, ctx As oraEntities, Optional copyKeys As Boolean = True) As t Try Dim cloneE As t = ctx.CreateObject(Of t)() Dim pis As PropertyInfo() = entity.GetType.GetProperties() For Each pi As PropertyInfo In pis Dim attrs As EdmScalarPropertyAttribute() = DirectCast(pi.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) For Each attr As EdmScalarPropertyAttribute In attrs If Not copyKeys AndAlso attr.EntityKeyProperty Then Continue For End If 'Strung und NULL abfangen, wird trotz Standardwert im SQL Server nicht imgesetzt Dim objVal As Object If pi.PropertyType = GetType(String) And pi.GetValue(entity, Nothing) Is Nothing Then objVal = "" Else objVal = pi.GetValue(entity, Nothing) End If pi.SetValue(cloneE, objVal, Nothing) Next Next Return cloneE Catch ex As Exception Throw ex End Try End Function und zu vergleichen; Public Function Compare(Of t As EntityObject)(entityOriginal As t, entityCopy As t) As Boolean Try 'Um Änderungen einer Entität festzustellen (t.equals funktioniert aufgrund der Abhängigkeiten mit anderen Tabellen nicht) Dim pisOrig As PropertyInfo() = entityOriginal.GetType.GetProperties() For Each piOrig As PropertyInfo In pisOrig Dim attrs As EdmScalarPropertyAttribute() = DirectCast(piOrig.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) If attrs.Count > 0 Then 'Fremdschlüsseltabellen ausschliessen Dim objOrig As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing)) Dim objCopy As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing)) If Not objOrig.Equals(objCopy) Then Return False End If End If Next Return True Catch ex As Exception Throw ex End Try End Function Verknüfte Tabellen werden dabei allerdings nicht übernommen!
Public Class VisibilityConverter Implements IValueConverter Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert Try If value Is Nothing OrElse CBool(value) = False Then Return Visibility.Collapsed Return Visibility.Visible Catch ex As Exception Return Visibility.Collapsed End Try end class End Functiondann eine Klasse die Freezable erbt und eine DependencyProperty "Data" bereitstellt.
Public Class BindingProxy
Inherits Freezable
'Freezable überschreiben
Protected Overrides Function CreateInstanceCore() As Freezable
Return New BindingProxy()
End Function
'Diesen Namen (Data) in der dataProperty und im XAML verwenden
Public Property Data() As Object
Get
Return DirectCast(GetValue(DataProperty), Object)
End Get
Set(value As Object)
SetValue(DataProperty, value)
End Set
End Property
'DependencyProperty für die "Data"
Public Shared ReadOnly DataProperty As DependencyProperty = DependencyProperty.Register("Data", GetType(Object), GetType(BindingProxy), New UIPropertyMetadata(Nothing))
End Class
In den PageResources bzw. Datagridresources diese beiden Klassen referenzieren:
dann die proxy klasse des Grids bestücken. Ich mach das via code
Dim p As BindingProxy = CType(grdElementeBearbeitung.Resources("proxy"), BindingProxy)
p.Data = CType(grdBereiche.SelectedItem, text_bereich)
und die Visiblity der Spalte an die Data Property bzw. das Feld binden
Visibility="{Binding Data.spalte_anzeigen,Converter={StaticResource VisibilityConverter},Source={StaticResource proxy}}"
oder auf Englisch: New transaction is not allowed because there are other threads running in the session. Szenario: In einer Schleife werden Objekte einer Tabelle verarbeitet und nach erfolreicher verarbeitung als "verarbeitet" markiert. Dabei schlägt der context.savechanges des Enityty Frameworks fehl. der Grund ist sowohl simple als auch, zumindest für mich, anfänglich nicht ganz verständlich, da ich eben an dieser Stelle speichern möchte. Die verwendete EF Connection behält die Änderungen des Objects bei und setzt diese auf "modified", so dass ein einmaliges savechanges genügt um alle Objekte zu speichern. Das Kuriose ist, dass es EF das nicht einmal zulässt, selbst wenn man die schlechtere Performance in Kauf nehmen wollte. Schuld ist die Schleife, die Objekte zur Laufzeit aus dem Context liest und so eine Änderung nicht zulässt...
Using db as new EF_Context Dim jobs = From w In db.jobs Where Not w.verarbeitet.HasValue For Each job In jobs 'Verarbeitung If verarbeite_job(job) = true then 'abhaken job.verarbeitet = now 'db.savechanges 'SCHLÄGT FEHL!!! else 'loggen endif Next db.SaveChanges 'HIER ISSES RICHTIG End Using