Laden...
J
jogibear9988 myCSharp.de - Member
Programmierer Offenau Dabei seit 17.07.2007 641 Beiträge
Benutzerbeschreibung

Forenbeiträge von jogibear9988 Ingesamt 641 Beiträge

12.11.2012 - 23:34 Uhr

Aber bei Reflection wird die DLL in die AppDomain geladen, und Cecil macht das nicht (wenn Ichs richtig verstanden habe)!

12.11.2012 - 13:54 Uhr

Gründe dafür gibt es mehrere, nicht nur den Wunsch, keinen unnötigen/unbenutzen Code an den Kunden auszuliefern, sondern auch schlicht die (Download-)Größe bzw. den (Haupt-)Speicherverbrauch zu reduzieren.

Aber das sollte doch heutzutage wirklich kein Problem mehr sein... 😉

04.11.2012 - 21:24 Uhr

Du kannst auch Cecil benutzen (wenn ich das richtig verstehe).

http://www.mono-project.com/Cecil

26.10.2012 - 09:06 Uhr

Ich denke Ich habs....

Wir haben in unseren DTO noch eine Klasse ("ChangeState") diese hat 3 bool Propertys : modified, new, delete.

Jedoch wurde im DL Layer dieses Objekt durch ein neues ersetzt. Nun konnte es dazu kommen das der DL Layer den neuen zustand einfach nicht mehr gespeichert hat, da ChangeState durch eine neue Instanz ersetzt wurde...

Hab das nun behoben...

26.10.2012 - 00:35 Uhr

das hier: WPF Diagram Designer - Part 4 oder der Designer von SharpDevelop...

25.10.2012 - 09:36 Uhr

@jogibear9988: nach erster durchsicht: du verwendest hier keinen lock oder ?

Nö, die Klasse ist ja auch nicht Threadsafe, sie dient nur zum wrappen des verbindungsaufbaus, Reconnect, Keepalive, etc...

24.10.2012 - 16:14 Uhr

Für die Basis TCP Kommunikation hab Ich mal eine Klasse realisiert. Vielleicht kannst du die ja gebrauchen: DotNetSiemensPLCToolBoxLibrary: TCPFunctionsAsync.cs

22.10.2012 - 09:29 Uhr

Ich hab mir ne Software gebaut wo Ich das SharpDevelop Control verwende:

Einfach das "DesignSurface" Control in eine Xaml Seite einbauen...


private string baseScreen =
            "<Grid Width=\"2048\" Height=\"1536\" Background=\"White\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    </Grid>";
        

Und im Konstruktor der Seite:

   BasicMetadata.Register(); //Basic Metadata for XAMl Designer

            var xmlReader = XmlReader.Create(new StringReader(baseScreen));
            designSurface.LoadDesigner(xmlReader, null);


Das einblenden der Properties im Ext-WPF-Toolkit Property Control geht bei mir so:
(Der PropertyEditor welcher bei SD dabei ist, gefällt mir nicht...)


designSurface.DesignContext.Services.Selection.SelectionChanged += Selection_SelectionChanged;      

void Selection_SelectionChanged(object sender, ICSharpCode.WpfDesign.DesignItemCollectionEventArgs e)
        {
            var b = designSurface.DesignContext.Services.Selection.SelectedItems;
            var mainWin = App.Current.MainWindow as MainWindow;
            if (b != null && b.Count == 1)
            {
                var en = b.GetEnumerator();
                en.MoveNext();
                mainWin.PropertiesEditor.SelectedObject = en.Current.Component;
            }
            else if (b!=null && b.Count > 1)
            {
                var en = b.GetEnumerator();
                en.MoveNext();
                //mainWin.PropertiesEditor.SelectedObjects = en.Current.Component;
            }
        }

und das hinzufügen von Controls hab Ich so gelöst:

Eine Listbox mit den Controls:



     private ObservableCollection<ToolBoxItem> Controls = new ObservableCollection<ToolBoxItem>();

 lstControls.ItemsSource = Controls;

            Style itemContainerStyle = new Style(typeof(ListBoxItem));
            itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(lstControls_PreviewMouseLeftButtonDown)));
            lstControls.ItemContainerStyle = itemContainerStyle;
 

            Controls.Add(new ToolBoxItem(typeof(Button)));
            Controls.Add(new ToolBoxItem(typeof(Label)));
            Controls.Add(new ToolBoxItem(typeof(TextBox)));
            Controls.Add(new ToolBoxItem(typeof(Rectangle)));
            Controls.Add(new ToolBoxItem(typeof(Image)));


 private void lstControls_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (sender is ListBoxItem)
                //if (lstControls.SelectedItem != null)
                {
                    ListBoxItem draggedItem = sender as ListBoxItem;          
                    draggedItem.IsSelected = true;
                    var itm = draggedItem.Content as ToolBoxItem;
                    var tool = new CreateComponentTool(itm.Control);
                    if (App.DesignSurface != null)
                    {
                        App.DesignSurface.DesignContext.Services.Tool.CurrentTool = tool;
                        DragDrop.DoDragDrop(this, tool, DragDropEffects.Copy);
                    }
                }
        }

hoffe das hilft dir weiter...

20.10.2012 - 00:11 Uhr

Schau dir das mal an: WPF Diagram Designer - Part 4

auch in SharpDevelop gibt es eine XAML Editor Komponente: SharpDevelop\src\AddIns\DisplayBindings\WpfDesign

19.10.2012 - 17:18 Uhr

Gerade bei Properties ist das doch einfach zu finden.
Ersetze die Properties durch "echte" die man debuggen kann, und setze einen bedingten Breakpoint.

Genau das hab ich doch schon gemacht. Traceausgabe in die Property, und siehe da, sie wird nur auf true gesetzt und nie mehr auf false, trotzdem gibt mein Trace der Datenbankfunktion, welche die Property ausliest, nachdem sie auf true gesetzt wurde, false zurück....

Das Problem ist, der gleiche Soure läuft bei 5 Kunden, da hab Ich dieses Problem nicht, und auch bei dem Kunden, bei dem der Fehler passiert, von 100 Db schreibvorgängen nur 5-6 mal am Tag...

19.10.2012 - 12:08 Uhr

Per Reflection arbeitet die Datenbank schicht, um die Werte der Objekte zu lesen, aber gesetzt wird da nichts.
(Die Datenbank schicht wird aber auch noch umgebaut! -> Zu langsam...)

Ich schau mal weiter was Ich mir noch vorstellen kann, wenn Ich was rausfinde poste Ichs hier...

18.10.2012 - 10:11 Uhr

Kann es denn noch ein Problem machen, das der Wert des DTOs über PropertyInfo.GetValue ausgelesen wird?

17.10.2012 - 22:02 Uhr

Hab nun das isClosed mal volatile gemacht, genauso habe Ich im setter den wert in ein logfile geschrieben...

Das problem ist: isClosed wird in meinem code auf true gesetzt und nie mehr auf false. Jedoch wird an der Stelle wo das DTO in die Datenbank geschrieben wird isClosed == false aus dem DTO gelesen... (Das DTO wird aber definitiv erst nach dem setzten von isClosed auf true in die SchreibListe eingetragen)
Im Moment habe Ich keine weitere Idee, Ich poste mal morgen noch etwas Code...

17.10.2012 - 13:22 Uhr

Wenn du nur das wissen willst, warum hast du das Feld dann nicht schon lange mal (testweise) volatile gemacht?

Das habe Ich ja jetzt gemacht! isClosed auf volatile aber das DateTime Feld nicht (geht ja eh nicht!)! Mal schauen was nun passiert...

17.10.2012 - 09:23 Uhr

Bei dem Task Objekt wird isClosed auf true gesetzt bevor es in die Liste zum speichern eingetragen wird.

Die Liste ist über Locks Synchronisiert, Ich sehe auch das das Objekt auf jedenfall im Datalayer in die Datenbank geschriben wird, jedoch ist dann der Wert von isClosed = false.

Ich will nur wissen, kann es daran liegen das im DTO die Felder nicht volatile sind?

16.10.2012 - 19:59 Uhr

Wir haben eine Applikation welche Daten in eine Datenbank speichert.

Es gibt da das DTO Objekt:


public class Task{
public string Name{get;set;}
public bool islosed{get;set;}
public DateTime ClosedTime{get;set;}
}

Dann gibt es eine Funktion die es schliest und in eine Liste zum speichern einträgt:


public Close(Task tsk)
{
tsk.isClosed = true;
tsk.ClosedTime = DateTime.Now;

SaveTask(tsk)
}

Nun wird in der SaveTask Methode das Objekt in einer Liste zum speichern abgelegt! Dann läuft ein Timer nebenher, der diese Liste immer wieder abarbeitet und die Objekte in die Datenbank speichert.

Nun passiert es aber, das Objekte für welche Close aufgerufen wurde trotzdem in der Datenbank als nicht Closed stehen. Das isClosed wird aber nirgends mehr zurück gesetzt.

Muss denn das Feld der isClosed Property volatile sein, da das speichern in einem Timer abläuft? Könnte das mein Problem sein?

Der Code entspricht natürlich nicht dem orginalen, ich musste das etwas verkürzen!

14.10.2012 - 10:50 Uhr

Ich hab da auch noch eine Open Source Bibliothek, welche auf libnodave aufsetzt, aber noch ein bischen mehr bietet:

  • Routing
  • Read Optimierung
  • S7 Projektsupport (Nur lesen)

http://siemensplctoolboxlib.codeplex.com

Darin hat auch jeder Tag eine ValueChanged Event, d.h. wenn du die Tags Zyklisch in einem Timer liest, wird bei Wertänderung deine Funktion aufgerufen. Und INotifyPropertyChanged ist auch implementiert, so kannst du auch an die Werte in WPF binden...

10.10.2012 - 09:22 Uhr

Es geht auch mit den Standart .Net Serializern....

(Bis Ich das gefunden habe, ufff...)


 System.IO.FileStream jj = new FileStream(opnDlg.FileName, FileMode.Open);
var settings = new XmlReaderSettings(){CheckCharacters = false};
                var read = XmlTextReader.Create(jj, settings);
                System.Xml.Serialization.XmlSerializer myXml = new XmlSerializer(typeof(ObservableCollection<VarTabRowWithConnection>));
                var saved = (ObservableCollection<VarTabRowWithConnection>)myXml.Deserialize(read);

10.10.2012 - 08:23 Uhr

das rekursive macht der nun genutzte serialiser schon, er sollte so sogar feldnamen escapen wenn diese ein solches sonderzeichen enthalten, da dort die gleiche funktion zum schreiben aufgerufen wird...
ich glaube z.b. bei anderen datentypen gehts, da nur in string diese sonderzeichen nicht zulässig sind, un mein problem war ja, meine property ist nicht direkt ein string sondern ein object, welches ein string enthalten kann... sonst hätt ich einfach die property als anderen typ serialisiert...

09.10.2012 - 23:42 Uhr

Habs nun am laufen...

Nutze den Seriliser von hier: http://sharpserializer.codeplex.com/

Aber der geht auch noch nicht...

Hab dann folgende Klasse eingebaut:


public static class StringEscaper
    {
        public static string Escape(string text)
        {
            return System.Web.HttpUtility.UrlEncode(text);
        }

        public static string UnEscape(string text)
        {
            return System.Web.HttpUtility.UrlDecode(text);
        }
    }

diese will ich noch durch was ersetzen, was nur die XML ungültigen zeichen ausmaskiert...

Dann habe Ich noch dies in defaultXmlWriter und defaultXmlReader eigebaut...

ungefähr so:


public void WriteAttribute(string attributeId, object value)
        {
            if (value == null) return;
            if (value is string) 
                _writer.WriteAttributeString(attributeId, StringEscaper.Escape((string)value));
            else
            {
                string valueAsText = _simpleValueConverter.ConvertToString(value);
                _writer.WriteAttributeString(attributeId, valueAsText);
            }
        }

09.10.2012 - 22:35 Uhr

@Abt:
Naja, es steht zwar drin, wie man verhindert das Invalides XML erzeugt wird, aber eben keine Lösung um strings mit Sonderzeichen zu Serialisieren und Deserialisieren.

Und mein Problem ist ja noch, in meiner Property ist nicht immer ein String!

@Herbivore:
Naja, hätte schon gern XML, aber wenns nicht einfach geht... Schau mir gerade die verschiednen Serializer auf Codeproject an, aber mit keinem scheints zu funzen...
Hab aber auch keine Lust selber einen zu schreiben (zumindest im Moment!).

09.10.2012 - 13:23 Uhr

Das die Zeichen ungültig sind hab Ich schon kapiert, aber Ich suche nun nach einer schönen Lösung, wobei Ich möglichst wenig Aufwand betreiben muss.

Gibt es irgeneine möglichkeit in den Serializer einzugreifen, so das wenn beim Serialisieren der Datentyp in der Object Variable ein String ist, das Ich dann Sonderzeichen maskiere, und später wieder zurückwandle?

Oder einen XML1.1 Serializer für .NET?

09.10.2012 - 12:20 Uhr

Das problem ist, die Property ist vom Typ Object! Und Sie kann ab und ein ein String sein, aber natürlich auch ein anderer Datentyp.

Gibts den keinen Serializer mit dem dies funktioniert?

09.10.2012 - 11:39 Uhr

@herbivore:

es schlägt bei alle zeichen kleiner code 20 glaub fehl. Die Exception kommt gleich beim Deserialisieren. Aber Ich gehe doch davon aus das der XMLSerializer Strings so maskiert das er Sie auch wieder laden kann. Mit den zeichen "<" und ">" macht er es ja auch so das es geht!

Ich finde immer nur Beispiele im Netz die mir sagen ich soll diese zeichen im String nicht zulassen, aber genau das will ich doch. Ich will Sie nur irgenwie maskiert haben. Gibts den dazu noch keine fertige Lösung? z.B. einen XMLSerialiser der XML 1.1 kann ?

09.10.2012 - 00:07 Uhr

Hallo, Ich möchte eine Klasse Serialisieren, welche div. String properties hat.
In den Strings können auch Sonderzeichen (Ascii < 20) vorkommen.

Serialisiert wird das ganze schön, ohne probleme.

in dem XML File steht dann für Ascii "0" z.b. "&#x0;".

Wenn Ich das ganze jedoch wieder Deserialisiere bekomm Ich eine Exception:> Fehlermeldung:

InvalidOperationException -> hexadezimaler Wert 0x00 ist ein ungültiges Zeichen!

Aber wieso kommt der Fehler? Der wert wurde doch schön maskiert!

Einer ne Idee und abhilfe?

06.10.2012 - 11:55 Uhr

Sowas hab ich auch schon mal gemacht, allerdings nicht als script editor, sondern als normaler dateieditor, dafür mit features wie suchen ersetzten, dateiverfolgung (a la baretail), highlighting von zeilen, etc... Kann den source auch gerne mal reinstellen vieleicht kannst du ja noch was einbauen.

Für suchen ersetzten habe ich folgendes projekt verwendet: A Universal WPF Find / Replace Dialog

02.10.2012 - 23:46 Uhr

Du kannsts damit probieren: http://awesomium.codeplex.com/

01.10.2012 - 12:47 Uhr

Ich würde dir GIT empfehlen. Der Vorteil dabei im Gegensatz zu SVN ist, das du auch wenn du unterwegs bist, und keinen Onlinezugriff auf dein Repo hast, Commits durchführen kannst!

26.09.2012 - 13:35 Uhr

Gibt es eine Möglichkeit in einer Applikation das ToolBox-Icon eines WPF Controls zu bekommen? Also z.B. von System.Windows.Controls.Button?

20.09.2012 - 15:09 Uhr

Ich habs nun am laufen. Ich habe mir noch ein Loader schreiben müssen, der aus der AppDomain nach aussen geht, und nicht mein konkreter Typ.

Dadurch das Ich immer direkt den Typ der Plugin Instanz nach ausen gegeben habe wurde diese auch in die Hauptdomain geladen!

20.09.2012 - 01:16 Uhr

Hallo, hab Probleme mit AppDomains.

Ich habe eine Basiklasse Servicebase, welche von MarshalByRefObjekt ableitet.

Nun hab ich verschiedene Kind Klassen welche davon ableiten, und in verschiedenen Appdomains gestartet werden sollen.

das mache ich so:

host = hostAppDomain.CreateInstanceFrom(dllFile, className.Split(',')[0]);

hostAppDomain ist meine neue Domain.

bis dahin geht auch alles...

sobald ich aber das aufrufe:

var inst = (ServiceBase)host.Unwrap();

ist die DLL auch in meiner CurrentAppDomain geladen. (Das sehe ich mit AppDomain.CurrentDomain.GetAssemblies() ).

Kann mir jemand sagen was Ich falsch mache? Die DLLs dürfen nur in der neuen AppDomain geladen sein, da Ich bei der Anwendung im laufenden Betrieb DLLs austauschen muss und Ich nur die neue AppDomain entladen kann!

17.09.2012 - 15:38 Uhr

Vielleicht hilft dir das weiter: FormattedText Class (System.Windows.Media)

Damit kannst du die größe eines Formatierten textes ermitteln...

14.09.2012 - 22:30 Uhr

Ok, das Problem ist durch ein modified Closure wurde das propertyChanged Ereignis für den Wert nicht aufgerufen.

Nun ist aber das Verhalten in SL und WPF immer noch anderst. In SL wird das Ereignis Tag.ToString aufgerufen, in WPF wird direkt an den Wert von Value gebunden.

Ideen dazu??

14.09.2012 - 15:06 Uhr

Ok, Sl scheint vom tag Objekt die toString Methode aufzurufen, während sich WPF an die default Prperty Bindet.


public override string ToString()
        {
            return Value != null ? Value.ToString() : null;
        }

Jedoch ruft eigendlich mein Tag Objekt wenn sich der Value ändert, von seinem Parent Objekt RaisePropertyChanged auf, mit seinem Namen d.h. so wie die Property im Parent Objekt heißt!

14.09.2012 - 14:48 Uhr

Hallo, Ich habe ein problem...

ich hab ein Objekt Tag, welches eine Prperty Value hat.

vereinfacht sieht die Klasse so aus:


 [DefaultBindingProperty("Value")]
    public class Tag : INotifyPropertyChanged
    {

 public object Value
        {
            get
            {
                return this.ScaleValue(originalValue);
            }
            set
            {
                OriginalValue = this.ScaleControlValue(value);
            }
        }

internal void SetValueFromServer(object Value)
        {
            if (originalValue != Value)
            {
                originalValue = Value;
                this.OnPropertyChanged("OriginalValue");
                this.OnPropertyChanged("Value");
                ValueChanged();
            }
        }
}

ist nur eine gekürtzte Version, aber das triffts...

In WPF habe ich mir nun über dynamicObject eine Tree Struktur mit tag Objekten aufgebaut, an die Ich meine controls dann binden kann:


<TextBox Text="{Binding Tag1}" />

das funktioniert auch.

Jedoch in silverlight geht das mit dem Dynamic Objekt nicht,... ok, daher habe Ich das ganze per Dymisch erzeugten typen über Reflection.Emit nachgebaut, funktioniert auch...

Nur mein Binding geht so nicht:


<TextBox Text="{Binding Tag1}" />

Ich muss immer so Binden:


<TextBox Text="{Binding Tag1.Value}" />

dann funktinierts? Wieso? SL unterstützt doch DefaultBindingProperty auch, oder?

26.08.2012 - 13:40 Uhr

Get type erwartet einen AssemblyQualifiedName, aus MSDN: "Der durch die Assembly qualifizierte Name eines Typs besteht aus dem Typnamen einschließlich dessen Namespace, gefolgt einem Komma sowie dem Anzeigenamen der Assembly. Der Anzeigename einer Assembly kann mit der Assembly.FullName-Eigenschaft abgerufen werden."

Du kannst auch alle Typen deiner assemlby durchlaufen, und dann den Namen vergleichen und die Instanz erstellen.

Aber dashier: if (tmpCrtl == typeof(System.Windows.Window)) wird bestimmt auch fehlschlagen (da der Typ deines Festers nicht Window ist, sondern der Base Type davon wahrscheinlich Window ist), das sollte dann gehen: "if (tmpCrtl is System.Windows.Window)"

12.08.2012 - 22:09 Uhr

@Diräkt: Danke fuer deine Antwort, aber ich moechte TcpListener eigentlich vermeiden, da die Klasse etwas alt ist, Socket ist da bischen moderner.

Wo steht das? Ichdenke Socket Ist da einfach ein Level weniger Abstrahiert! Aber TCPListener veraltet??

10.08.2012 - 12:37 Uhr

Ich habe ein einer Bibliothek ein eigens List View Control erzeugt:

Auszug aus dem Code der Klasse...


public class FilterGridView : ListView
    {

        static FilterGridView()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterGridView), new FrameworkPropertyMetadata(typeof(FilterGridView)));
            ItemsSourceProperty.OverrideMetadata(typeof(FilterGridView), new FrameworkPropertyMetadata(ItemsSourcePropertyChanged));            
        }
        
        private GridView gridView;
        public FilterGridView()
        {
            
            this.gridView = new GridView();
            this.View = gridView;
        }
     }

auszug aus meinem XAML:

generic.xaml


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Controls="clr-namespace:ControlPanel.SharedClasses.Controls"
                    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
                    xmlns:local="clr-namespace:ControlPanel.SharedClasses"
                    xmlns:s="clr-namespace:System;assembly=mscorlib">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/ControlPanel.SharedClasses;component/Themes/FilterGridView.xaml" />
        <ResourceDictionary Source="/ControlPanel.SharedClasses;component/Themes/LoadingControl.xaml" />
    </ResourceDictionary.MergedDictionaries>
   

</ResourceDictionary>

filtergridview.xaml


<Style TargetType="{x:Type FilterGridView:FilterGridView}">
        <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
        <!--<Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />-->
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.CanContentScroll" Value="true" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type FilterGridView:FilterGridView}">
                    <Border Name="Border"
                            Background="{StaticResource WindowBackgroundBrush}"
                            BorderBrush="{StaticResource SolidBorderBrush}"
                            BorderThickness="1">
                        <Grid Background="LightGray">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                                <RowDefinition Height="30" />
                            </Grid.RowDefinitions>

                            <!--<ScrollViewer Grid.Row="0" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
                                <ItemsPresenter />
                            </ScrollViewer>-->

                            <DockPanel Grid.Row="1"
                                       Background="DarkGray"
                                       LastChildFill="True">
                                <StackPanel DockPanel.Dock="Right">
                                    <StackPanel Margin="4"
                                                HorizontalAlignment="Right"
                                                Orientation="Horizontal">
                                        <StackPanel.Resources>
                                            <Style TargetType="{x:Type Button}">
                                                <Setter Property="FontFamily" Value="Webdings" />
                                                <Setter Property="Width" Value="60" />
                                                <Setter Property="Margin" Value="4,0,4,0" />
                                            </Style>
                                            <Style TargetType="{x:Type TextBlock}">
                                                <Setter Property="Margin" Value="4,0,4,0" />
                                                <Setter Property="VerticalAlignment" Value="Center" />
                                            </Style>
                                            <Style TargetType="{x:Type TextBox}">
                                                <Setter Property="Margin" Value="4,0,4,0" />
                                                <Setter Property="Width" Value="40" />
                                            </Style>
                                        </StackPanel.Resources>
                                        <Button Name="cmdPageFirst" Content="9" />
                                        <Button Name="cmdPagePrevious" Content="3" />
                                        <TextBlock Text="Page" />
                                        <TextBox Name="txtPageCurrent" Text="1" />
                                        <Button Name="cmdPageNext" Content="4" />
                                        <Button Name="cmdPageLast" Content=":" />
                                    </StackPanel>
                                </StackPanel>
                            </DockPanel>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsGrouping" Value="true" />
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBorderBrush}" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Ich habe zum test mal den ScrollViewer komplett deaktiviert, aber die ListView wird ganz normal angezeigt, d.h. mein Style wird nicht verwendet! Hat jemand ne Idee???

02.07.2012 - 17:07 Uhr

Ich hab das schon mal so gelöst. Dazu muss aber jeder Behavior der im Style gesetzt werden soll ICloneableBehavior implementieren!

Hab das glaub irgendwo im netz so gefunden, und dann nochn bischen was erweitert, genau weiß Ich das aber auch nicht mehr...


<Style TargetType="TextBox">
        <Setter Property="Behaviors:StylizedBehaviors.Behaviors">
        <Setter.Value>
        <Behaviors:StylizedBehaviorCollection>
        <txt:TextBoxStdCommandsBehavior />
        </Behaviors:StylizedBehaviorCollection>
        </Setter.Value>
        </Setter>
        </Style>


 public interface ICloneableBehavior
    {
        object Clone();
    }

 public class StylizedBehaviorCollection : Collection<Behavior>
    { }

    /// <summary>
    /// Helper Class to apply Behaviors via a Style.
    /// But the Behavior has to implement ICloneableBehavior!
    /// </summary>
    public class StylizedBehaviors
    {
        #region Fields (public)
        public static readonly DependencyProperty BehaviorsProperty = DependencyProperty.RegisterAttached(
            @"Behaviors",
            typeof(StylizedBehaviorCollection),
            typeof(StylizedBehaviors),
            new PropertyMetadata(null, OnPropertyChanged));
        #endregion
        #region Static Methods (public)
        public static StylizedBehaviorCollection GetBehaviors(DependencyObject uie)
        {
            return (StylizedBehaviorCollection)uie.GetValue(BehaviorsProperty);
        }

        public static void SetBehaviors(DependencyObject uie, StylizedBehaviorCollection value)
        {
            uie.SetValue(BehaviorsProperty, value);
        }
        #endregion

        #region Static Methods (private)
        private static void OnPropertyChanged(DependencyObject dpo, DependencyPropertyChangedEventArgs e)
        {
            var uie = dpo as UIElement;

            if (uie == null)
            {
                return;
            }

            BehaviorCollection itemBehaviors = Interaction.GetBehaviors(uie);

            var newBehaviors = e.NewValue as StylizedBehaviorCollection;
            var oldBehaviors = e.OldValue as StylizedBehaviorCollection;

            if (newBehaviors == oldBehaviors)
            {
                return;
            }

            if (oldBehaviors != null)
            {
                foreach (var behavior in oldBehaviors)
                {
                    int index = itemBehaviors.IndexOf(behavior);

                    if (index >= 0)
                    {
                        itemBehaviors.RemoveAt(index);
                    }
                }
            }

            if (newBehaviors != null)
            {
                foreach (var behavior in newBehaviors)
                {
                    int index = itemBehaviors.IndexOf(behavior);

                    if (index < 0)
                    {
                        if (behavior is ICloneableBehavior)
                        {
                            itemBehaviors.Add((Behavior) ((ICloneableBehavior) behavior).Clone());
                        }
                        else
                        {
                            throw new NotImplementedException("Behavior does not implement ICloneableBehavior");
                        }
                    }
                }
            }
        }
        #endregion
    }
02.07.2012 - 15:12 Uhr

Upgedatete Version:

Da ich die Version nun schon ein paar mal geupdatet habe, aber nicht die zeit habe das hier auch noch zu pflegen, hier ein Link unter dem die aktuelle version immer erreichbar sein sollte:

TCPFunctionsAsync.cs

27.06.2012 - 22:54 Uhr

Ich habe einen Float Wert "1E+35" gibt mir ToString für den Wert aus. Nun möchte Ich den Wert aber gleich wie ein anderes Programm als "100000E+30" darstellen?? Ich hab in der MSDN nichts gefunden wie Ich das mit einem FormatString bewerkstelligen könnte...

21.06.2012 - 15:17 Uhr

DataTable gibts in SilverLight nicht!

21.06.2012 - 14:58 Uhr

Hier gibts ein Beispiel: Reading XML documents using LINQ to XML

21.06.2012 - 08:51 Uhr

1.) Ja ist eien DataTable
2.) Nein, da Ich ja für jede neue Zeile eine alte löschen will.
3.) Ja, das bräuchte Ich eingentlich nicht mehr... Könnte auch direkt durch die Rows auflistung wandern.
4.) Der Code läd die 30 neusten datensätze aus der DB und schaut dann ob Sie schon in meiner Datatable sind, wenn nicht fügt er den DS hinzu und löscht den ältesten dafür!

Ich weis das kann ich performanter machen, indem Ich z.b. meinen letzten Index an die DB übergebe und dann nur diese auslese. Das wird auch noch gemacht!

Mich würde nur interessieren, warum meine WPF-DataTble welche an LastDatasets gebunden ist nicht aktualisiert wird!

20.06.2012 - 15:28 Uhr

Ich hab nun noch folgendes Versucht:


 public class NotifyDataTable : DataTable, INotifyCollectionChanged
    {
        public event NotifyCollectionChangedEventHandler CollectionChanged;

        public NotifyDataTable(DataTable tbl)
        {
            List<DataColumn> pKeys = new List<DataColumn>();
            foreach (DataColumn column in tbl.Columns)
            {
                var col = this.Columns.Add(column.ColumnName, column.DataType);
                if (tbl.PrimaryKey.Contains(column))
                    pKeys.Add(col);
            }

            this.PrimaryKey = pKeys.ToArray();

            foreach (DataRow row in tbl.Rows)
            {
                this.Add(row);
            }
        }

        public void Remove(DataRow row)
        {
            this.Rows.Remove(row);

            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, row));
        }

        public void Add(DataRow row)
        {
            this.ImportRow(row);
            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, row));            
        }        
    }

Aber auch wenn nun an die NotifyDataTable gebunden wird, und per Add was hinzugefügt wird, wird das DataGrid nicht aktualisiert!

20.06.2012 - 13:58 Uhr

Wenn Ich hier nachschaue: DataTable Class implementiert DataTable nicht IBindingList oder IBindingListView

20.06.2012 - 13:29 Uhr

hab kein MSSQL Server, nutze MySQL!

Also mit folgendem Code trägt er zwar immer den neusten datensatz in die datatable "LastDatasets" ein, jedoch wird das gebundene DataGrid nicht aktualisiert!


 void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Stop();

            if (LastDatasets!=null)
            {
                var newds = dataInterface.ReadFromDatabase(null);
                foreach (DataRow row in newds.Select())
                {
                    var id = row["id"];
                    if (!LastDatasets.Rows.Contains(id))
                    {
                        LastDatasets.ImportRow(row);
                        var minRow = LastDatasets.Select("id = MIN(id)").FirstOrDefault();
                        if (minRow != null)
                            LastDatasets.Rows.Remove(minRow);
                    }
                }
            }
            else
            {
                LastDatasets = dataInterface.ReadFromDatabase(null);
            }
            timer.Start();
        }

20.06.2012 - 11:54 Uhr

Jetzt habs ichs umgebaut das nur neue Rows in die dataTable kommen, aber die Oberfläche aktualisiert sich nicht! Unterstützt denn eine dataTable kein IColelctionChanged (oder wie das Interface auch heißt)