Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Easyrider
Thema: 01.05.2013 - Tag der Arbeit: Wie habt ihr den Tag gestaltet?
Am im Forum: Smalltalk

Da ich aus Bayern, und um genau zu sein aus Niederbayern komme, wird bei uns traditionell am 1. Mai der Maibaum aufgestellt. Den Rest des Tages mit den Kindern gespielt oder im Garten entspannt. ;)

Thema: Translator, (GUI-)Texte einfach und schnell übersetzen
Am im Forum: Projekte

Beispielprojekt siehe Anhang

Thema: [gelöst] DataView.RowFilter mit Berechnung gesucht
Am im Forum: GUI: Windows-Forms

Hallo Herbi,

ja, du hattest Recht. Durch einen Bug ist die Spalte leider als String hinzugefügt worden.

Vielen Dank für den Tip.

mfg

Stefan

Thema: [gelöst] DataView.RowFilter mit Berechnung gesucht
Am im Forum: GUI: Windows-Forms

Hallo,

in einer meiner Anwendungen bin ich gerade auf ein Problem gestoßen, das ich alleine + Suche in Google + MSDN nicht lösen kann.

Aufgabenstellung:

Die Anwendung bekommt ein Dataset via DataSet.ReadXML. Es ist keine Datenbankanbindung dahinter vorhanden. Jetzt muss auf das DataSet ein Filter gesetzt werden. Dies geschieht über eine DataView mit einem RowFilter. Der Benutzer muss den Filter in einer Textbox eingeben können. Bei der Eingabe des Filters kann es zu Berechnungen kommen.

Beispiel:

Dataset mit 100 Einträgen:

Spalten A zeigt die Werte für einen Minimalwert an, beispielhaft 1 - 100.
Spalte B zeigt die Werte für einen Maximalwert an, beispielhaft 100 - 1000.
Spalte C zeigt die Werte für einen aktuellen Wert an, der irgendwo zwischen Minimal- und Maximalwert liegt.

In der Berechnung soll der Benutzer eine Formel wie folgt eingeben können:

AktuellerWert > MinimalWert * 1,1


Wenn ich so etwas in einem richtigen DataView eingebe, dann schafft er es nicht den Wert für MinimalWert zu finden. Es kommt die Fehlermeldung, das die Operation "*" mit System.String nicht durchgeführt werden kann. Bedeutet, er kann den Text MinimalWert nicht mit dem Wert der Spalte ersetzen.

Hat jemand eine Idee, wie ich das Problem lösen könnte?

mfg

Stefan

Thema: [gelöst] Command-Binding bei verschachtelten DataTemplates
Am im Forum: GUI: WPF und XAML

Hallo,

ich beantworte mir meine Frage mal selbst, falls andere das Problem auch noch haben.

Das DataGrid kann anscheinend keine Bindings per ElementName auf einzelne Einträge in einer Row. Man kann das Problem umgehen, indem man einen DataContextProxy benutzt. Die vollständige Lösung dazu findet ihr hier.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace JobPlan.Controls
{
    public class DataContextProxy : FrameworkElement
    {
        public DataContextProxy()
        {
            this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);
        }

        void DataContextProxy_Loaded(object sender, RoutedEventArgs e)
        {
            Binding binding = new Binding();
            if (!String.IsNullOrEmpty(BindingPropertyName))
            {
                binding.Path = new PropertyPath(BindingPropertyName);
            }
            binding.Source = this.DataContext;
            binding.Mode = BindingMode;
            this.SetBinding(DataContextProxy.DataSourceProperty, binding);             
        }

        public Object DataSource
        {
            get { return (Object)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }

        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null);


        public string BindingPropertyName { get; set; }

        public BindingMode BindingMode { get; set; }
        
    }
}

Sobald man diese Klasse in den StaticResources einbaut und die Property mit Binding Source={StaticResource DataContextProxy},Path=DataSource.MeineProperty anspricht, dann gehts.

Was ich mich noch frage ist, warum es im DataGrid nicht geht. Das konnte ich leider noch nicht beantworten. Falls jemand die Antwort weiß, würde ich mich freuen wenn Sie mir jemand beantwortet.

mfg

Easy

Thema: [gelöst] Command-Binding bei verschachtelten DataTemplates
Am im Forum: GUI: WPF und XAML

Hallo winsharp93,

wir verwenden bei unserem Projekt eine vergleichbare Implementierung von ICommand. Diese wurde bereits über hundert Mal benutzt, da vermute ich keine Probleme.

Wenn ich anstatt eines Buttons eine Checkbox hinbaue und das IsChecked={Binding IsSelected} setze, dann geht das. Selbst wenn noch das Command dabei steht. Aber mehr leider auch nicht. Der Command wird wieder nicht ausgeführt.

Folgende Ideen hatte ich noch über Nacht, aber die muss ich noch überprüfen:

- Das DataGrid registriert die Commands und bearbeitet sie, somit bekomme ich sie nie.
- Die Checkbox selbst registriert das Click-Command und behandelt es.

Werds mir heute Vormittag nochmal genauer angucken.

Thema: [gelöst] Command-Binding bei verschachtelten DataTemplates
Am im Forum: GUI: WPF und XAML

Hallo,

ich habe aktuell ein Problem mit verschachtelten DataTemplates und Command-Binding und finde einfach keine Lösung. Folgende Problemstellung:

In meiner View habe ich einen TemplateSelector, der mir je nach Einstellung eines von drei verschiedenen Grids anzeigt. Die Grids liegen somit in einem DataTemplate. Innerhalb eines Grids muss ich nun eine Spalte anzeigen, welche wiederum ein eigenes DataTemplate hat. In diesem DataTemplate liegt nun ein Control, das einen Command aus dem ViewModel ausführen soll.

Der DataContext der Grids ist an das ViewModel gebunden. Leider reicht das aber nicht. Der Command bzw. das Command-Binding wird nie aufgerufen. Egal welche Lösung ich probiere. Folgende Dinge bin ich schon durch:

- DataContext innerhalb des DataTemplates noch einmal setzen (per ElementName mit Grid und TemplateSelector)
- Command via normales Binding setzen
- Command via RelativeSource=RelativeSource TemplatedParent setzen
- Command via ElementName (Grid + TemplateSelector) setzen

Bei Google habe ich heute bestimmt schon eine Stunde gesucht. Hat jemand eine Idee, wie ich das Problem lösen könnte? Es muss doch eine Lösung dafür geben... Wahrscheinlich seh ich nur den Wald vor lauter Bäumen nicht mehr.

mfg

Easy

Thema: Wie motiviert ihr euch für "doofe" Aufgaben?
Am im Forum: Smalltalk

Zurück zum Thema:

Zitat
Wie könnt ihr euch da motivieren?

Bei mir ist es meistens eine Mischung aus allem. Ich höre manchmal (vor allem nach 10 Stunden aufwärts) Technobase.fm oder Hardrock.fm, damit mein Hirn nicht wegdöst. Bei richtig langweiligen Arbeiten versuche ich, sie immer so schnell wie möglich hinter mich zu bringen. Nix aufschieben, nicht warten. Sofort erledigen. Dann hat man es hinter sich. Und man kann wieder an interessanteren Dingen arbeiten.

Sollte ich dazwischen mal fünf Minuten Pause brauchen, um den Kopf frei zu kriegen, surf ich entweder oder geh mal kurz einen Tee holen. Aber nicht länger, sonst geht die Motivation flöten.

Ich weiß das die meisten Menschen versuchen, ungeliebte Arbeiten auf die lange Bank zu drücken. Oder sie geben sie anderen Kollegen. Aber die Arbeit bleibt die gleiche. Wenn man sich angewöhnt hat, so etwas sofort zu machen, quält es einem nicht mehr, und man hat den Kopf frei für wichtigere Dinge.

Just 4 your Info

Easy

Thema: Pfeil mit Polygonen zeichnen: Linie steht über
Am im Forum: GUI: WPF und XAML

Hallo hypersurf,

hab deinen Quellcode kopiert und in ein komplett leeres Projekt eingefügt. Der Fehler ist einfach nachzuvollziehen. Leider macht er keinen Sinn. Es sieht so aus, wie wenn das Polygon bei dem Punkt einfach fünf Pixel hinzufügt.

Wenn man den Punkt X2 auf 390 legt, dann stimmt die Zeichnung:

        <Canvas Height="600" Width="400">
            <Polygon Stroke="Black">
                <Polygon.Points>
                    <Point X="201.0" Y="135.0"/>
                    <Point X="390.0" Y="135.0"/>
                </Polygon.Points>
            </Polygon>
            <Polygon Stroke="Red">
                <Polygon.Points>
                    <Point X="377.0" Y="145.0"/>
                    <Point X="395.0" Y="135.0"/>
                    <Point X="377.0" Y="125.0"/>
                </Polygon.Points>
            </Polygon>
        </Canvas>

Als optionale Lösung würde ich vorschlagen, kein Polygon zu benutzen. Du hast ja nur zwei Koordinaten, was einer Linie entspricht:
<Canvas Height="600" Width="400">
            <Line X1="201.0" Y1="135.0" X2="395.0" Y2="135.0" Stroke="Black" />
            <Polygon Stroke="Red">
                <Polygon.Points>
                    <Point X="377.0" Y="145.0"/>
                    <Point X="395.0" Y="135.0"/>
                    <Point X="377.0" Y="125.0"/>
                </Polygon.Points>
            </Polygon>
        </Canvas>

Hier funktioniert 395.0 einwandfrei.

mfg

Easy

Thema: FIAE => Staatliche oder private Berufsschule?
Am im Forum: Smalltalk

So, muss auch mal meine Erfahrungen dazu wiedergeben. Zu mir persönlich:

Ausbildung zum FIAE, dualles System mit Arbeit und blockweise staatliche Berufschule.


Von der Ausbildung her kann ich mich nicht über meine Berufschule beschweren. Die Themen über die drei Jahre verteilt vermitteln ein sehr gutes Basiswissen, auf dem ich aufgebaut habe. Meine Lehrer in den Fächern IT waren alle gut bis sehr gut.

- Im Fach Anwendungsentwicklung Programmierung (C++) hatte ich einen sehr guten Lehrer, der einem die Fehler und Beispiele gut erklären konnte. Die Theorie der Objektorientierung ist zwar abstrakt, aber da muss man durch ;-)
- Im Fach Netzwerk war der Lehrer auch gut und hat es gerne an Praxisbeispielen gezeigt. Beispielsweise eigene Netzwerkkabel bauen, Netzwerke aufbauen etc.
- In der Kategorie Unix hatte ich den besten Lehrer. Er war zwar streng, hat sich aber für jeden Zeit genommen und auch Erfahrungen weitergegeben, die unabhängig zum Thema sind. Beispielsweise war sein fachliches Wissen so gut, das er als als Forensiker bei der Polizei geholfen hat. Ein "touch" auf gewisse Dateien simuliert, das man an einer Datei gearbeitet hat ;-)


Im Großen und Ganzen hängt die Ausbildung viel zu sehr von den Lehrern ab. Ob jetzt eine private oder staatliche Schule besser ist, kann man pauschal nicht beurteilen. Ich für meinen Teil hätte ohne die staatliche Berufsschule ziemlich viel Wissen versäumt, vor allem im Bereich Unix. Würde meine Ausbildung in der Schule nicht freiwillig gegen eine private eintauschen.

mfg

Easy

P.S.: Meine Berufschule war die Karl-Peter-Obermaier-Schule in Passau.

Thema: Beim Veröffentlichen des Projekts wird eine andere Version angezeigt als per Reflection
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Benutz die Eigenschaft Application.ProductVersion. Damit kannst du die Version aus der AssemblyInfo auslesen.

Thema: Humor: Java Programmierer ... und andere lustige Sachen
Am im Forum: Smalltalk

Das ist zwar kein Horror, musste aber auf Anhieb schmunzeln:

/// <summary>
///     Yes, we can.
/// </summary>
public bool CanSort
{
    get { return true; }
}

:-)

*edit: Codestyle überarbeitet

Thema: SL: Tooltip programmatisch mit Style hinzufügen
Am im Forum: GUI: WPF und XAML

Erstmal danke für deine Antwort.

Hast du vielleicht ein Beispiel dazu? Ich bekomme die Fehlermeldung "A value of type 'DataTemplate' cannot be added to a collection or dictionary of type 'ToolTipGroup'".

Zum Test habe ich mir ein Objekt in den Resources des Controls vom Typ ToolTipGroup angelegt. Darunter dann das DataTemplate. Ich bin mir ziemlich sicher, das ich es einfach noch falsch mache, verstehe aber den Fehler leider nicht ganz.


<class:ToolTipGroup x:Name="toolTipGroup">
    <DataTemplate>
        <Stackpanel>
         ...
        </Stackpanel>
    </DataTemplate>
</class:ToolTipGroup>

Thema: TemplateBinding in VisualStates
Am im Forum: GUI: WPF und XAML

Hallo,

ist das "static" oben im Konstruktor Absicht?

Thema: SL: Tooltip programmatisch mit Style hinzufügen
Am im Forum: GUI: WPF und XAML

Hallo,

ich bin gerade auf der Suche nach Lösungsansätzen für folgendes Problem:

Für ein neues Usercontrol (ListBox) soll der ToolTip variabel gestaltet werden. Das bedeutet, das pro ListBoxItem der ToolTip zur Laufzeit via Datenbankeinträge manuell gesetzt wird. Dieser soll in einer Liste von "ToolTipGroups" sowie ToolTipItems gespeichert werden.

ListBoxItem 1
- ToolTipGroup 1
-- ToolTipItem 1
-- ToolTipItem 2
-- ToolTipItem 3
- ToolTipGroup 2
-- ToolTipItem 1
-- ToolTipItem 2
-- ToolTipItem 3
...

Die ObservableCollection<ToolTipGroup> hat eine Liste von ToolTipItems. Ein ToolTipItem besitzt zwei Eigenschaften namens Key und Value, welche in zwei Textblöcken dargestellt werden soll.

Mein Problem besteht jetzt darin, das ich nicht weiß wie ich das ganze darstellen soll. Ich kann es nicht fest in XAML implementieren, da die Anzahl der ToolTipGroups und -Items unbekannt ist. Dynamisch kann ich (meines Wissens nach) nur Text als CodeBehind zum ToolTip hinzufügen.

Wie kann ich im Code-Behind den Content des ToolTips pro Item so setzen, dass er so arbeitet wie folgender Codeabschnitt?


<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Key}" />
    <TextBlock Text="{Binding Value}" />
</StackPanel>

mfg

Easy

Thema: Networkstream Bild versenden
Am im Forum: Netzwerktechnologien

Das etwas über das Netzwerk verloren geht kannst du ausschließen. Laut dem Codefragment weiter oben benutzt du TCP. Im TCP-Protokoll gibt es Überprüfungen, die sicherstellen das jedes einzelne Paket vollständig und in der richtigen Reihenfolge ankommen. Siehe Wikipedia TCP, Datenintegrität und Zuverlässigkeit.

Sollte es dennoch zu einem Fehler kommen und ein Paket unvollständig / nicht rechtzeitig ankommen, gibt es eine Exception nach oben.

Schau mal in den Schichten weiter oben nach, ich denke da liegt der Fehler.

*edit: Zu blöd für korrektes Deutsch...

Thema: OutOfMemory Exception obwohl RAM erst bei 50 % Auslastung
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

OT: Egal was da im Hintergrund gemacht wird, der Speicherverbrauch ist exorbitant zu hoch. Sowas kann man von keinem Anwender verlangen, wenn man nicht gerade hochaufwendige mathematische Berechnungen anstellt. /OT

Thema: ComboBox Text geht verloren
Am im Forum: GUI: Windows-Forms

Hallo,

wenn du trotzdem noch den alten Weg bevorzugst, wäre die entsprechende Lösung die Eigenschaft "SelectedItem".

Thema: Windows Forms TextBox aus extra Thread ändern
Am im Forum: GUI: Windows-Forms

Nein, weil das ein ungültiger Threadübergreifender Vorgang wäre. In den oben genannten Links findest du mehr Infos darüber.

Thema: Coding Styles Horror
Am im Forum: Smalltalk

Gerade in einem Prototypen auf Arbeit gefunden:

foreach (var dokument in SelectedDokuments)
{
    selectedDoc = dokument;
    break;
}

Schädel -> Wand

Thema: Silverlight Treeview, Expander Icon austauschen
Am im Forum: GUI: WPF und XAML

Hallo,

wie in der Überschrift beschrieben versuche ich gerade, das Expander Icon eines gecustomizten TreeViewItems auszustauschen. Aber irgendwie krieg ich das nicht gebacken.

Meine Klassen sehen so aus:

ExtendedTreeView:

    public class ExtendedTreeView : TreeView
    {

        private bool isChanging = false;

        /// <summary>
        /// Default Constructor
        /// </summary>
        public ExtendedTreeView()
        {
            this.Loaded += new RoutedEventHandler(ExtendedTreeView_Loaded);
        }

        private void ExtendedTreeView_Loaded(object sender, RoutedEventArgs e)
        {
            this.UpdateLayout();

            foreach (ExtendedTreeNode node in this.Items)
                node.ItemWidth = this.ActualWidth - 70;
        }

        // More code here
}

ExtendedTreeNode:

 public class ExtendedTreeNode : ContentControl, INotifyPropertyChanged
    {

        #region " Private Variables "

        private double itemWidth = 100.0;
        private string text = string.Empty;
        private ImageSource image = null;
        private ImageSource defaultImage = null;
        private ImageSource folderImage = null;
        private NodeType type = NodeType.Folder;
        private ObservableCollection<ExtendedTreeNode> nodes = new ObservableCollection<ExtendedTreeNode>();

        #endregion

        #region " Properties "

        /// <summary>
        /// Get or set the list of tree nodes, which are below this node.
        /// </summary>
        public ObservableCollection<ExtendedTreeNode> Nodes
        {
            get { return this.nodes; }
            set
            {
                this.nodes = value;
                this.OnPropertyChanged("Nodes");
            }
        }

        /// <summary>
        /// Get or set the width of the item
        /// </summary>
        public double ItemWidth
        {
            get { return this.itemWidth; }
            set
            { 
                this.itemWidth = value;
                OnPropertyChanged("ItemWidth");
            }
        }

        /// <summary>
        /// Get or set the text for the tree node.
        /// </summary>
        public string Text
        {
            get { return this.text; }
            set 
            {
                this.text = value;
                this.OnPropertyChanged("Text");
            }
        }

        /// <summary>
        /// Get or set the image, which is shown on the left side of the node text.
        /// </summary>
        public ImageSource Image
        {
            get
            {
                if (this.image == null)
                    if (this.type == NodeType.Category)
                        return this.defaultImage;
                    else
                        return this.folderImage;
                else
                    return this.image;
            }
            set
            {
                this.image = value;
                this.OnPropertyChanged("Image");
            }
        }

        /// <summary>
        /// Get or set the type of the node.
        /// </summary>
        public NodeType Type
        {
            get { return this.type; }
            set
            {
                this.type = value;
                OnPropertyChanged("Type");
            }
        }

        #endregion

        #region " Event "

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
}

generic.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:local="clr-namespace:XXX.YYY.Controls"
                    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
                    xmlns:converter="clr-namespace:XXX.YYY.Controls.Converter"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    mc:Ignorable="d">

    <converter:ToolTipConverter x:Name="tooltipConverter" x:Key="toolTipConverter" />

    <Style TargetType="local:ExtendedTreeView">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                    <StackPanel Orientation="Horizontal" Height="18">
                        <Image Source="{Binding Image}" Width="16" Height="16" VerticalAlignment="Center" HorizontalAlignment="Left"/>
                        <TextBlock Text="{Binding Text}" FontWeight="{Binding FontWeight}" Margin="5,0,0,0"
                                   TextTrimming="WordEllipsis" TextAlignment="Left" Width="{Binding ItemWidth}"
                                   VerticalAlignment="Center" HorizontalAlignment="Left">
                        </TextBlock>
                        <ToolTipService.ToolTip>
                            <ToolTip>
                                <TextBlock Text="{Binding Text}" />
                            </ToolTip>
                        </ToolTipService.ToolTip>
                    </StackPanel>
                </sdk:HierarchicalDataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

Ich habe versucht, die Lösung von hier zu implementieren, aber nicht hinbekommen. Auch weil ich kein Blend habe.

Bei vielen weiteren Google-Suchen und auch hier habe ich leider kein funktionierendes Beispiel gefunden.

Hat so etwas schon mal jemand gemacht? Hat jemand ein (funktionierendes) Beisp dazu? Oder hat jemand die Zeit+Geduld, mir das zu erklären?

mfg

Easy

Thema: [gelöst] Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)
Am im Forum: GUI: WPF und XAML

Hallo,

vielen Dank für das ausgiebige Beispiel gfoidl, jetzt hab ich verstanden was du meinst.

Gelöst habe ich das ganze jetzt mit einer Kombination aus dem Beispiel von dir sowie der CollectionViewSource, dir mir einiges an Arbeit abnimmt.

Danke Jungs

mfg

Easy

Thema: [gelöst] Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)
Am im Forum: GUI: WPF und XAML

Zitat
Das heißt es wird auch erst zur Laufzeit entschieden nach was sortiert/gruppiert werden soll? Dann geht nur der Weg über Reflektion.

Ja, das wird erst zur Laufzeit entschieden. Über ein Kontextmenü hat der Benutzer die Möglichkeit, Gruppierung und Sortierung zu beinflussen (Ausschalten, Spalte Ändern, Sortierreihenfolge). Daher auch der Zwang, es mit Reflection hinzubekommen.

Der feste Cast im ObjectComparer ist nur zu "rationalen" Zwecken vorhanden. Bitte ignorier ihn. In der fertigen Anwendung wird das ganze natürlich über Reflection ausgelesen.
Zitat
Wenn dem so ist würde ich ein Mapping Typ <-> Comparer erstellen (in einem Dictionary und dann kann von dort einfach der Comparer<T> geladen werden und gut ist es.

Ich gestehe, das ich diesen Satz nicht verstehe. Hast du ein Beispiel dazu, damit ich mir das Wissen aneignen kann?

mfg

Easy

P.S.: @winSharp93: Ich geh die CollectionViewSource gerade durch und schaue, ob ich diese auch anstelle des komplexen Reflection-Zeugs benutzen kann. Thx für den Tip.

Thema: [gelöst] Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)
Am im Forum: GUI: WPF und XAML

Hallo gfoidl,

mit Methoden und Funktion hast du Recht. Das passiert, wenn man zu lange VB programmiert. Bitte das Wording nicht ganz so genau nehmen.

Zum Problem: Meine Objekte kommen von extern. Ich programmiere ein Control in Silverlight, das für die Anzeige der Objekte verantwortlich ist. Dazu gehört, das ich die Objekte gruppieren und sortiern kann. Da das Control aber von unterschiedlichen Anwendungen mit unterschiedlichen Objekten benutzt wird, habe ich keine Chance einen festen Datentyp zu benutzen. Ich weiß, dass genau das das große Problem ist. Aber es ist nunmal Teil der Aufgabe. Leider.

So etwas wie deinen Property-Selector habe ich drin, siehe GetSorter. Oder meinst du noch etwas anderes?

mfg

Easy

P.S.: Wäre dir der Threadtitel "Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)" lieber? Hab in .Net 1.0 angefangen, somit bin ich hier noch etwas oldschool veranlagt. 8)

Thema: [gelöst] Silverlight: OrderBy mit unbekanntem Datentyp (Reflection)
Am im Forum: GUI: WPF und XAML

Hallo,

ich wiedermal. Bin derzeit bei einer Sortierung, wo ich nicht weiterkomme. Als Aufgabe habe ich, eine Liste von Objekten (z. B. als ObservableCollection) nach Eigenschaften aus dem Objekt selbst zu sortieren. Das schwierige daran ist, das ich die Klasse des Objekts selbst nicht zur Verfügung habe. Die Eigenschaften müssen also via Reflection ausgelesen werden.

Hier mal ein bischen Quellcode:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person()
        {}

        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public override string ToString()
        {
            return this.Name + " " + this.Age.ToString();
        }
    }

    public class ObjectComparer : IComparer<object>
    {
        public int Compare(object x, object y)
        {
            Person a = (Person)x;
            Person b = (Person)y;

            if (a.Age < b.Age)
                return -1;
            else if (a.Age > b.Age)
                return 1;
            else
                return 0;
        }
    }

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        public IOrderedEnumerable<object> OrderSequence()
        {
            object[] persons = 
            {
                new Person("Christian", 13),
                new Person("Thomas", 20),
                new Person("Stefan", 25),
                new Person("Alex", 1)
            };

            var sorter = GetSorter();
            var sortedNumbers = persons.OrderBy(sorter, new ObjectComparer());

            return sortedNumbers;
        }

        private Func<object, IComparable> GetSorter()
        {
            return o => ((object)o).GetType().GetProperty("Age").Name;
        }

        private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {

            IOrderedEnumerable<object> numbers = OrderSequence();

            foreach (object num in numbers)
            {
                this.lblResult.Text += num.ToString() + Environment.NewLine;
            }
        }
    }

Ich habe die eigentliche Aufgabe in ein kleines Beispielprojekt ausgegliedert und den Quellcode dann kopiert.

Die Liste mit den Personen soll nun nach dem Alter der Person sortiert werden. Die Funktion "OrderSequence" darf aber die Klasse "Person" selbst nicht kennen.

Leider funktioniert die Sortierung so noch nicht, da ich andauernd Kompilerfehler wie invalid Arguments oder
Fehler
The type arguments for method 'System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>, System.Collections.Generic.IComparer<TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
bekomme. Selbst nach vielfachem Suchen in Google und hier konnte ich kein Beispiel finden.

Kann mir jemand von euch erklären, was ich hier falsch mache?

mfg

Easy

Thema: [gelöst] Silverlight: DLL Referenz -> neue Property "verschwindet" manchmal
Am im Forum: GUI: WPF und XAML

Hallo,

ich möchte euch die Lösung nicht vorenthalten:

- Im Projektordner die Ordern "bin" und "obj" löschen
- Visual Studio (2010) schließen
- Computer neu starten.

Das hat das Problem gelöst. Keine Ahnung woher das Visual Studio die Informationen bzw. die alte DLL hatte, aber er musste sie sich irgendwo noch speichern. Eine Windows-Suche hat hier nix gefunden.

Hauptsache jetzt funktioniert es.

Thema: [gelöst] Silverlight: DLL Referenz -> neue Property "verschwindet" manchmal
Am im Forum: GUI: WPF und XAML

Habs gerade probiert über "Extras - Browserverlauf löschen - Alles anhaken - Löschen". Danach DLL neu kompiliert, von Hand rüber kopiert und Referenz neu gesetzt. Leider immer noch das gleiche Problem.

Thema: [gelöst] Silverlight: DLL Referenz -> neue Property "verschwindet" manchmal
Am im Forum: GUI: WPF und XAML

Hallo,

wir haben derzeit in der Firma ein etwas ungewöhnliches Problem mit Silverlight 4. Während dem Erstellen von DLLs "verschwinden" einige Eigenschaften, die wir kurz vorher implementiert haben. Das ganze passiert nicht regelmäßig, sondern nur hin und wieder. In den letzten vier Wochen hatte unser Team (10 Mann) das Problem exakt drei Mal.

Ausführliche Problembeschreibung:

Es gibt zwei Komponenten. Eine DLL, die Controls bereitstellt, und eine Silverlight-Anwendung, die diese DLL benutzt und die Controls anzeigt.

Silverlight-DLL (Class control):
- Property A
- Property B
- Property C

Silverlight Anwendung (Class UI):
- Control control
- ...

Wenn wir jetzt in der DLL eine neue Property namens "Property D" hinzufügen, das Projekt neu kompilieren und die DLL in der Anwendung ersetzen, fehlt manchmal die neu erstellte Property D.

Wir haben bereits alle Möglichkeiten von menschlichen Fehlern ausgeschlossen. Die Datei wurde definitiv neu kompiliert (clean build, bin-folders löschen etc). Die Datei wurde, von wo die DLL-Refernenz kommt, gelöscht und in der Anwendung neu hinzugefügt. Wir haben das ganze eingecheckt und auf einem komplett anderen Rechner durchkompiliert. Er findet die Eigenschaft D trotzdem nicht.

Vom Gefühl her ist das so, wie wenn er eine Shadow-Copy macht, die Kopie aber beim neu Erstellen nicht Ersetzen kann und somit die alte DLL benutzt. Wie wenn er sich diese irgendwo wegspeichern würde.

Ein weiteres Problem ist, dass das ganze nicht regelmäßig auftritt. In den letzten vier Wochen hatten wir es drei mal, jedesmal bei unterschiedlichen DLL-Projekten, bei unterschiedlichen Personen und auf unterschiedlichen Rechnern. Nach einer gewissen Zeit, meist so ein guter Tag, verschwindet das Problem wie von Geisterhand.

Der Fehler ist da, lässt sich aber nicht konstant reproduzieren. Uns gehen langsam die Ideen aus, was das noch sein könnte. Daher unsere Frage an euch:

Kennt jemand von euch dieses Problem?
Hatte es vielleicht schonmal jemand selbst?

Über ein paar Tips würden wir uns freuen.

mfg

Easy

P.S.: Beispielcode darf ich aus sicherheitstechnischen Gründen leider nicht liefern.

Thema: [Silverlight] Listbox, Wrappanel mit Gruppierung
Am im Forum: GUI: WPF und XAML

Hallo,

die Breite vom Wrappanel ist die wichtige. Der Expander sollte eine komplette "Zeile" des Wrappanels ausfüllen.

Thema: [Silverlight] Listbox, Wrappanel mit Gruppierung
Am im Forum: GUI: WPF und XAML

Hallo,

ich bin gerade bei einem technischen Problem und bräuchte kurz eure Hilfe:

In meiner Anwendung ist eine Listbox mit einem Wrappanel als ItemsPanel. Dieses Wrappanel hat ein DataTemplate, um die einzelnen Items grafisch darstellen zu können. Via einem Slider und einer ViewBox ist zusätzlich ein Zoom implementiert.

<ListBox x:Name="listbox2" SelectionMode="Extended"
                     ItemsSource="{Binding Converter={StaticResource GroupingItemsControlConverter},
                     ConverterParameter={StaticResource SimpleGroupingItemsControlConverterParameter}}"
                     SelectionChanged="ListBox_SelectionChanged"
                     Height="280" Width="570"
                     HorizontalAlignment="Left" VerticalAlignment="Top">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel Orientation="Horizontal" Width="540" Loaded="WrapPanel_Loaded" />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
...
<DataTemplate>
                        <Viewbox Stretch="UniformToFill">
                            <Border BorderBrush="DarkGray" BorderThickness="1" Margin="5,5,5,5">
                                <StackPanel Orientation="Vertical" Width="100" Height="50">
                                    ...
                                </StackPanel>
                            </Border>
                        </Viewbox>
                    </DataTemplate>
...

Meine Ziel ist es jetzt, zusätzlich zu diesen Funktionalitäten eine Gruppierung einzubauen. Wenn ich darin z.B. 15 Tiere habe, haben diese jeweils eine bestimmte Spezies (Fisch, Katze, Hund). Die Items sollen bei aktivieren der Gruppierung mit einem Expander angezeigt werden.

Die gängigen Lösungen im Internet für Gruppierungen funktionieren leider nicht. Sobald ich den Wert ItemWidth oder ItemHeight des Wrappanels setze, wird auch das Item für die Gruppierung auf die Breite gesetzt. Das darf aber nicht sein, da die Gruppe die ganze Zeile ausfüllen muss.

Wie kann ich innerhalb eines Wrappanels in einer Listbox so etwas umsetzen? Hat so etwas schon mal jemand gemacht?

Würde mich über Hilfe freuen.

mfg

Easy