Laden...
Avatar #avatar-3402.jpg
7.e.Q myCSharp.de - Member
Student Mechatronik Scheeßel Dabei seit 06.10.2004 925 Beiträge
Benutzerbeschreibung

Forenbeiträge von 7.e.Q Ingesamt 925 Beiträge

30.10.2009 - 09:50 Uhr

Clients sind es nicht viele. Ich schätze so 50 - 500. Je nachdem wie weit ich die Verbreitung treibe. Bisher ist die Info über das Programm nur an meine Mitstudierenden gegangen, derer ich insgesamt (zusammen mit mir) rund 50 habe.

Eine einzelne Mail-Adresse wäre sicher im Bereich des machbaren. Ich schau's mir mal an. Eventuell wäre da IMAP4 auch interessant, da es ja auch Ordnerstrukturen erlaubt. Damit könnte ich die Daten dann bei Bedarf (der noch nicht besteht) auch serverseitig filtern. Muss ich nur schauen, ob ich 'nen kostenfreien IMAP4 Anbieter finde.

POP3 geht natürlich auch.

29.10.2009 - 17:56 Uhr

Daten nur an bestimmte Clients ist nicht erforderlich. Filtern sollen die Clients, bzw. die Benutzer nachher selber.

Azure braucht zur Installation 'nen IIS 7.0 auf dem System. Den hab ich nicht. Woher kriegt man den den?

Alternative zu Azure wäre ja eventuell Google App Engine. Die kann man nur leider (noch?) nicht in C# programmieren.

EMail wäre noch 'ne Möglichkeit. Aber auch da ist das Problem, dass ich für jeden Client eine eigene Adresse bräuchte. Die Adressen der Benutzer will ich dafür nicht nutzen müssen, da dann ja andauernd reine Datenmails in deren Postfächern auftauchen.

29.10.2009 - 10:27 Uhr

Hi Leute,

für eine Reihe kleiner Datensätze (im Grunde XML-serialisierte .NET Objekte, also Text) brauche ich ein Übertragungsmedium, das auch Daten speichern kann, bis sie vom Client abgerufen werden. Also im Grunde ein Instant-Messaging-System.

Ich möchte für eine kleine Anwendung, die ich hier gerade fürs Studium entwickle, keinen extra Server einrichten müssen. Es sollte also als Gegenstelle ein System sein, das bereits im Web vorhanden und per API programmierbar ist. Sowas wie Twitter im Grunde, nur für kleine Datenpakete. Jeder Client soll also ungefiltert alle Datenpakete bekommen, die seit seinem letzten Start/Login auf dem System neu hinzugekommen sind.

Hat da jemand 'ne zündende Idee? Kann man Twitter für sowas missbrauchen? Eventuell auch Jabber mit 'nem einzelnen Account, der immer an sich selber schickt, oder sowas?

  • Twitter finde ich als Schnittstelle insofern ungut, da es nur max. 140 Zeichen zulässt, was für die "kleinen" Datenpakete zu wenig ist.

  • Bei Jabber weiß ich nicht, wie zuverlässig das ist, bezogen auf die Zustellung "offline" ergangener Daten (Nachrichten). Außerdem vermute ich, dass eine Nachricht, die ich mir selber schicke, vom ersten Client, der sich auf meinem Account anmelden würde, sofort als gelesen markiert würde. Jeder nachfolgende Client würde die Nachricht also nicht mehr bekommen. Und für jeden Client einen eigenen Account einzurichten, halte ich für Overkill.

Ideen? 😃

Danke!

Grüße,
Hendrik

29.10.2009 - 08:01 Uhr

Jupp, danke für die Links.

Ich fand, dass das auch 'ne eigene Scene-News verdient hat. Denn dein erster Link ist lediglich ein Thread im Smalltalk und in letzterem geht's nur um die Beta 2. Vom Release ist da noch keine Rede, wenn ich das jetzt in der Kürze der Zeit richtig ermittelt hab...

29.10.2009 - 07:36 Uhr

Wie von Microsoft offiziell verlautbart erscheinen Visual Studio 2010 und .NET 4.0 am 22. März 2010.

Microsoft will announce Visual Studio 2010 will officially launch on March 22, 2010.

Quelle

29.10.2009 - 07:28 Uhr

Du kannst dir das Command-Log im Filezilla doch life anschauen. Da müsstest du sehen können, ob der irgendwelche Commands versendet, während die Übertragung läuft.

Bedenke, dass es bei FTP meistens mehrere Verbindungen zwischen Server und Client gibt.

Falls nicht, dann ignoriert der Filezilla am Ende der Übertragung einfach die Tatsache, dass der Stream bereits geschlossen ist. Oder er überprüft dies und schließt den Stream nicht mehr selbsttätig.

Kommt die Datei denn nicht trotz der Fehlermeldung beim Close in deinem Programm vollständig an?

28.10.2009 - 10:31 Uhr

Serialisiert doch die String-Version des XmlDocuments. Beim Deserialisieren müsst ihr den String dann nur wieder in den Member einparsen.

28.10.2009 - 10:14 Uhr

Ein paar Korrekturen für euren Lizenztext, die mir gerade beim Lesen so ins Auge gesprungen sind (aua):

Absatz Privat:

  • Entgelt (nicht Endgeld)
  • ihr plenkt hinter "Universe Community"
  • erwirbt

Absatz Gewerblich:

  • deren
  • ihr plenkt schon wieder hinter "Universe Community ist"
  • "gilt" schreibt man mit einem l
  • weitere Plenks (und auch "Antiplenks", fehlende Leerzeichen) im ganzen Absatz
  • "benatragen" -> "beantragen"
  • ...

Ihr solltet den Text unbedingt nochmal korrekturlesen lassen.

Jaja, ich weiß, ich bin ein Rechtschreibtroll. 😃

26.10.2009 - 17:44 Uhr

Gruß pdelvo){gray}

klingt plausibel. Danke

26.10.2009 - 17:35 Uhr

Nur edit & Continue geht nur, wenn man mindestens das Startproject auf 32Bit setzt.

Kann mir mal nebenbei jemand in kurzen Worten erklären, weshalb das so ist?

26.10.2009 - 17:06 Uhr

Läuft hier auch einwandfrei. Alles Versionen aus'm MSDNAA:

  • Windows 7 Professional (x64)
  • Visual Studio Team System 2008 Team Suite (x86 and x64 WoW)
  • Expression Studio 3 (x86)
22.10.2009 - 17:12 Uhr

Hmm... das funktioniert aber nur, wenn man nicht schon ein Exchange Profil im iPod/iPhone laufen hat. Leider kann man derer nämlich nur ein einziges zur Zeit nutzen.

Ich werd mich mal nach alternativen Kalender-Apps umschauen, ob da was bei ist, das man direkt von/mit außen syncen kann.

Die iTunes COM Schnittstelle scheint keine derartigen Funktionen zur Verfügung zu stellen, oder übersehe ich etwas?

//edit: über Outlook. Das werd ich mir mal anschauen... danke für den Hinweis.

22.10.2009 - 16:50 Uhr

Gibt es irgendeine möglichst kostenfreie alternative Kalender-App, die man mit einem eigenen Programm syncen kann? Oder ist Apple das zu offen?

Witziges Ereignis nebenbei: Als ich "zu offen" schreiben wollte, wurde aus dem "zu" ein "uzi". Sigmund Freud hätte seine helle Freude an einem derartigen Tippfehler. Solche Assoziationen kommen einem als Entwickler wohl unbewusst im Hinblick auf Apples restriktives Verhalten.

//edit [Hintergrundinfo]: Ziel ist es, mit einem eingenen Programm Events im Kalender anlegen/bearbeiten/löschen zu können. Ich habe ein Tool für meine Mitstudierenden geschrieben, das die unübersichtliche Jahresdarstellung des Vorlesungsplans in eine anschauliche Wochenansicht umformatiert. Diese Darstellung würde ich nun gern mit dem Kalender im iPhone/iPod syncronisieren, damit man da immer die aktuellen Termine drin hat.

22.10.2009 - 16:24 Uhr

Hi Leute,

hat jemand 'ne Idee, wie ich mit C# Zugriff auf die Kalenderdaten eines iPod Touch oder eines iPhones bekomme?

Danke

Grüße,
Hendrik

21.10.2009 - 10:31 Uhr

Keine Antwort direkt auf deine Frage, weil ich dafür leider keine Zeit habe, aber immerhin das:

Natürlich könnte ich immer an alle senden und am Client die Daten filtern, aber diese Lösung wäre die letzte Wahl.

Ist gar keine Lösung, weil das ein eklatantes Sicherheitsproblem wäre. Wer sagt dir denn, dass am anderen Ende wirklich DEIN Client-Programm sitzt und brav filtert?

16.10.2009 - 18:43 Uhr

Hmm, hätte ich jetzt auch gedacht. Trotzdem bekomme ich besagte Fehlermeldung. Naja, ist auch wumpe. Hab's jetzt über das Settings-Framework gelöst.

Danke trotzdem.

16.10.2009 - 17:48 Uhr

Hi Leute,

folgende Zeile verursacht bei mir unter Windows 7 Prof. eine ArgumentException mit der Meldung "Ungültiger Bereich":


            IsolatedStorageFile tFil = IsolatedStorageFile.GetStore(IsolatedStorageScope.Roaming, null, null);

Dabei ist es auch wurscht, welchen Scope ich angebe.

Jemand 'ne Idee, woran das liegt? Funktioniert IsolatedStorage unter Win7 nicht mehr?

Danke

Grüße,
Hendrik

12.10.2009 - 18:25 Uhr

Nicht ganz das was ich suche.

Es soll eine Lasche farbig hinterlegt werden in Abhängigkeit zu einer Property des Objects, von dem die Lasche erzeugt wurde. Und dies soll eben nicht nur mit der ausgewählten Lasche passieren, sondern mit allen.

Konkret auf mein Problem bezogen soll das heißen: es gibt eine Reihe von Laschen (TabItems) von m vergangenen bis zu n zukünftigen Kalenderwochen. Die aktuelle Kalenderwoche soll farbig hervorgehoben werden. "Die aktuelle Kalenderwoche" ist dabei tatsächlich die Woche, zu der der jeweils heutige Tag gehört, nicht die im TabControl ausgewählte Woche.

12.10.2009 - 17:14 Uhr

Hi Leute,

ich suche eine Möglichkeit, folgendes Problem zu lösen:

ich habe ein TabControl, welches über eine gebundene ItemSource gefüllt wird. Die Titel der einzelnen TabItems fülle ich natürlich über die DisplayMemberPath-Property. Läuft wunderbest.

Abhängig von einer bestimmten Property des jeweiligen Items soll nun die Hintergrundfarbe oder andere Properties des darüber erzeugten TabItems geändert werden.

Konkret handelt es sich bei den TabItems des TabControls um Objekte einer Klasse "Kalenderwoche". Es soll nun also die aktuelle Kalenderwoche (ermittelt mit Hilfe von DateTime.Now, der Calendar-Klasse und CultureInfo) farbig hinterlegt werden.

Kann mir da jemand helfen?

Danke!

Grüße,
Hendrik

30.08.2009 - 10:33 Uhr

Was ist mit Songs unterschiedlicher Bitrate und solchen, deren ID3 Tags unterschiedlich detailiert, möglicherweise sogar falsch ausgefüllt sind? Solche Duplikate findet man ja nur über den Vergleich des Songs selbst.

28.08.2009 - 14:47 Uhr

Ja, das tut auch, aber dann kann ich keine abstrakten Methoden innerhalb der Klasse erstellen.

28.08.2009 - 11:14 Uhr

Das funktioniert, da mein Control, auch wenn es von ButtonBase abgeleitet ist, nicht abstrakt ist. Es funktioniert nur dann nicht, wenn der TargetType des Styles abstrakt ist. Ich halte das für 'nen Bug, hab's mal an Microsoft gemeldet. Mal schauen, was deren Support daraus macht.

28.08.2009 - 11:00 Uhr

Danke. Allerdings scheint zumindest Expression Blend 3 nicht in der Lage, das DefaultStyle des BasisControls zu bearbeiten, wenn es sich dabei um ein abstraktes Control handelt. Kann das jemand bestätigen? Der Button zum Bearbeiten der Resource in der Generic.xaml ist bei mir ausgegraut, deaktiviert, wenn die Klasse des Controls abstrakt ist.

27.08.2009 - 19:55 Uhr

Hi Leute,

ich hab hier 'n CustomControl, das ich nicht direkt initialisiert haben möchte, sondern welches als Basis, als Rahmen für eine ganze Reihe anderer Controls dienen soll. Daher hab ich die Klasse als abstract markiert. Ist das überhaupt zulässig?

Kann ich für eine ganze Reihe an Subklassen ein übergeordnetes Control definieren und in XAML dessen Äußeres festlegen und wird selbiges dann auch von den Subklassen verwendet, sofern nix anderes definiert ist?



abstract BasisControl : Control
|-- Control1 : BasisControl
|-- Control2 : BasisControl
    |-- Control2_1 : Control2


Würden dann alle diese Controls das Template des BasisControl verwenden?


    <Style TargetType="{x:Type local:BasisControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:BasisControl}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                    	<Label Content="{Binding Title, Mode=OneTime}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Oder muss ich wirklich für jedes BasisControl untergeordnete Control und dessen Erben einzeln Templates anfertigen? Das wäre ja fürchterlich.

Danke!

Grüße,
Hendrik

23.08.2009 - 22:03 Uhr

Laut http://de.wikipedia.org/wiki/Simple_Service_Discovery_Protocol ist die angegebene IP Adresse die Multicast-Adresse dieses Services. Bin mir gerade nicht sicher, muss man einem Lauscher explizit mitteilen, dass er Multicast-Pakete empfangen soll?

Schau dich mal beim Thema Multicast um! Da wirst du, denke ich, fündig.

20.08.2009 - 15:06 Uhr

Errrr... okay. Reguläre Ausdrücke lesen macht einen musig im Hirn... 8o Aber funktioniert.

Danke dir!

20.08.2009 - 14:54 Uhr

Hi Leute,

ich brauch mal eben 'nen Denkanstoß. Ich möchte einen String parsen, genauer gesagt eine Kommadozeile. Dazu soll der String am ersten Blank unterteilt werden, um den Befehl von den Argumenten abzutrennen.

Das Problem ist: der Befehl kann durchaus Blanks enthalten. Dazu muss der Befehl in Anführungszeichen gesetzt sein (wie auf der Windows Kommandozeile). In dem Fall soll als Trennpunkt die erste Leerstelle NACH dem in Anführungszeichen eingefassten Block genommen werden; alle Blanks innerhalb des Anführungszeichen-Blocks sollen ignoriert werden.

Jemand 'nen Tipp für mich?

Besten Dank!

Grüße,
Hendrik

17.08.2009 - 18:09 Uhr

So, hab meine persönlichen Änderungen an Silverlight XML-RPC nun auch einchecken können. Just for Info...

17.08.2009 - 11:07 Uhr

Also PHP als Gegenstelle. Dann würde ich empfehlen, dass du dir einen XML-RPC oder REST Service als Server-Gegenstelle baust. SOAP ist Overkill und von Inkompatibilitätsproblemen nur so gespickt, würd ich also die Finger von lassen. XML-RPC geht in Silverlight mithilfe der folgenden XML-RPC Class (weil Silverlight per se kein synchrones Abrufen von Webadressen unterstützt, was für XML-RPC aber erforderlich ist):

http://code.google.com/p/xmlrpc-silverlight/

Die Class hab ich selbst in Verwendung. Sie funktioniert soweit gut, kann aber in der aktuellen Trunk nur Fields automatisch befüllen. Ich hab eine Änderung, die auch Properties automatisch befüllt (automatisches Casten von XML-RPC Rückgaben in Objekte), werde sie einchecken, sobald mir der Projekt-Inhaber Schreibrechte erteilt.

Wenn du weitere Infos brauchst, schreib einfach...

17.08.2009 - 07:29 Uhr

Ich würde dir auch zu einem WebService raten. Was für ein System steht auf der Serverseite? Ein Windows? Ein Linux?

15.08.2009 - 09:23 Uhr

Das hatte ich auch schon mit drin, ohne Erfolg.

MyClassA funktioniert ja; wobei ich zu meiner Schande gestehen muss, dass ich was den Inhalt der Klasse angeht, nicht 100% ehrlich war. Sie enthält tatsächlich auch die besagten Getter und Setter Methoden. Asche auf mein Haupt!

Solch rätselhaftes Verhalten wäre m.E. einer Compiler-Meldung wert. Wenn der Compiler schon weiß, dass die Attachable Property existiert, er sie aber aus bekannten Gründen nicht verwenden kann, dann möchte ich als Entwickler gern eine entsprechende Fehlermeldung sehen, nicht ein schlichtes "Kenn ich nicht!". Reicht mir schon, dass meine Freundin mir auf einfachste Fragen häufigst mit 'nem schulterbezuckten "Weiß nich..." antwortet. Computer (Compiler?) sind eben doch Frauen.

15.08.2009 - 08:54 Uhr

Ja, das Projekt "buildet". Ich hab die Attachable Property jetzt mal mit dem von dir genannten Snippet erstellt und, oh Wunder, es funktioniert. Allerdings bin ich jetzt noch verwirrter als vorher, denn es will sich mir das Warum partout nicht erschließen.

Das Snippet hat zwei Methoden angelegt, die als Getter und Setter für die AttachableProperty fungieren. Sind diese zwingend erforderlich für AttachableProperties?

15.08.2009 - 03:04 Uhr

Hi Leute,

ich hab zwei Klassen in einem Projekt, die nahezu beide die selben Eigenschaften besitzen:


namespace LittleHelper
{
  public static class MyClassA
  {
    public static readonly DependencyProperty PropA = DependencyProperty.RegisterAttached("PropA", typeof(string), typeof(MyClassA), new FrameworkPropertyMetadata(string.Empty, OnSomethingChanged));

    private static void OnSomethingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }
  }
}


namespace LittleHelper
{
  public static class MyClassB
  {
    public static readonly DependencyProperty PropB = DependencyProperty.RegisterAttached("PropB", typeof(IEnumerable<string>), typeof(MyClassB), new FrameworkPropertyMetadata(OnSomethingChanged));

    private static void OnSomethingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }
  }
}

**Das merkwürdige und echt ärgerliche dabei ist, dass ich in einem XAML File, das den Namespace referenziert, eigenartigerweise nur Zugriff auf MyClassA hab. MyClassB taucht nicht im Intellisense auf und eine Verwendung wird mit einer Fehlermeldung quittiert, die Property PropB existiere nicht in diesem Namespace. **

Einziger Unterschied ist der Typ, den ich der AttachableProperty mitgegeben hab. Aber selbst der selbe Typ dort behebt das Problem nicht.


xmlns:lh="clr-namespace:LittleHelpers;assembly=LittleHelpers"

<Border lh:MyClassA.PropA="{SomeBindingStuff}" />
<Border lh:MyClassB.PropB="{SomeBindingStuff}" /> 

Im ObjectBrowser werden beide Klassen angzeigt, Build Action für beide Klassen-Code-Dateien ist Compile. Es gibt quasi genau null Unterschiede zwischen den Klassen.

Wer kann mir helfen? Ich weiß nicht weiter, hab keine Idee, woran das noch liegen könnte.

Es ist zum Mäuse melken. Immer diese besch... Blocking-Points, durch die keiner durchsteigt.

Danke!

Grüße,
Hendrik

14.08.2009 - 17:34 Uhr

Okay, ich schätze, ich hab das Problem gefunden.

Die ItemsSource (der ObjectDataProvider) für die RadioBox liefert mir eine Liste Strings (Enum.GetNames). SelectedItem hab ich hingegen an eine Property gebunden, die mir einen Enum-Wert liefert.

Gibt's da 'nen kurzen Weg? Oder muss ich über einen IValueConverter gehen?

//edit: entsprechenden IValueConverter implementiert, Problem gelöst.

14.08.2009 - 16:26 Uhr

Hi Leute,

ich hab ein Problem, welches ich auch nicht gedebugged bekomme:

I. Voraussetzungen

Ich hab folgende Dinge:

  1. ein Enum "TCDeviceType" mit 4 Werten
  2. eine RadioBox (CustomControl von ListBox abgeleitet mit RadioButtons als Items; IsSelected an IsChecked gebunden), die die 4 Enum-Werte über einen ObjectDataProvider bekommt
  3. eine "TCDevice" Klasse
  4. eine "TCAMSettings"-Klasse, die eine einzelne "TCDevice"-Instanz enthält (mNewDevice) und als Property rausreicht (NewDevice)
  5. ein "TCAMSettings"-Objekt ist in der App.xaml als Resource instanziiert ("TCAMSettingsBase")

... und etwas CodeBehind für ein Fenster

II. CodeBehind

Im CodeBehind des Fensters veranlasse ich die TCAMSettingsBase-Instanz, ihre Member-Variable vom Typ "TCDevice" zu initialisieren (die Member-Variable heißt "mNewDevice", "NewDevice" ist die Property):


    public void InitDevice() { this.NewDevice = new TCDevice(); }

NewDevice.set löst ein PropertyChanged-Event aus (TCAMSettings implementiert INotifyPropertyChanged)

III. Die "TCDevice"-Klasse

Die "TCDevice"-Klasse ist von DependencyObject abgeleitet und enthält eine Reihe von DependencyProperties, unter anderem eine vom Typ des in 1. erwähnten Enums "TCDeviceType".

IV. Was geht, was nicht

Was funktioniert:
Die RadioBox zeigt mir die 4 Werte des Enum sauber an, die Funktionsweise ist die einer RadioGroup.

Eine Änderung der Auswahl hat eine Aktualisierung der entsprechenden DependencyProperty TCAMSettingsBase.NewDevice.DeviceType zur Folge (eine über PropertyMetadata eingehängte OnPropertyChanged-Methode in der "TCDevice"-Klasse bestätigt die Änderung des Wertes).

Was nicht funktioniert:
Ich veranlasse TCAMSettingsBase über eine ihrer Methoden programmatisch, die "TCDevice"-Instanz neu zu initialisieren (siehe weiter oben unter II.). Danach ändere ich ebenfalls programmatisch auf der neuen Instanz den "DeviceType"-Wert über den Property-Setter. Diese Änderung wird trotz Binding nicht auf die Auswahl des RadioButtons übertragen.

V. Code Schnipsel

  1. Der ObjectDataProvider

    <ObjectDataProvider x:Key="TCDeviceTypes" MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:TCDeviceType" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

  1. Die Bindung an die RadioBox

    <SeveQsCustomControls:RadioBox DataContext="{Binding NewDevice, Source={StaticResource TCAMSettingsBase}}" SelectedItem="{Binding DeviceType, Mode=TwoWay}" Margin="0,39,0,0" VerticalAlignment="Top" ItemsSource="{Binding Source={StaticResource TCDeviceTypes}}" />

  1. Die TCAMSettings.NewDevice Property

    TCDevice mNewDevice = TCDevice.Empty;
    public TCDevice NewDevice
    {
        get { return mNewDevice; }
        private set { mNewDevice = value; OnPropertyChanged(new PropertyChangedEventArgs("NewDevice")); }
    }

Anmerkung: TCDevice.Empty ist ein static-field der TCDevice-Klasse, das im static-Constructor als leere "TCDevice"-Instanz initialisiert wird. Initialisiere ich mNewDevice mit null, so wirft mir das Binding an die NewDevice-Property eine Exception. Scheinbar kann man nicht an Properties binden, die null zurück liefern.

  1. Die TCDevice.DeviceType Property

    static readonly DependencyProperty DeviceTypeProperty = DependencyProperty.Register("DeviceType", typeof(TCDeviceType), typeof(TCDevice), new PropertyMetadata(TCDeviceType.None, new PropertyChangedCallback(OnPropertyChanged)));
    public TCDeviceType DeviceType
    {
        get { return (TCDeviceType)GetValue(DeviceTypeProperty); }
        set { SetValue(DeviceTypeProperty, value); }
    }

  1. TCDeviceType Enum

    public enum TCDeviceType
    {
        None,
        Container,
        Partition,
        Device
    }

VI. Die Frage

Wo liegt der Grund für den Umstand, dass die Bindung hier nur in einer Richtung funktioniert (Target->Source)?

Vielen Dank!

Grüße,
Hendrik

13.08.2009 - 15:15 Uhr

Ja, nur dass das bei mir sehr sehr eingeschränkt war. So ein schickes Framework wäre eine gute Grundlage für was neues. 😃

13.08.2009 - 15:07 Uhr

Übrigens hätte ich da schonmal ein Feature Request 😃

Es sollte möglich sein, Objekte zu erstellen, die mehrere Inputs haben. Also dass man auch sowas machen kann, wie im Anhang zu sehen (schematisch betrachtet).

//edit: kurz gesagt m Outputs mit n Inputs verbinden. Da wäre dann die Variante mit += am besten.

13.08.2009 - 14:46 Uhr

Der Body einer DependencyProperty sieht im Normalfall (auch in Silverlight) so aus:



DependencyProperty ThePropertyProperty = DependencyProperty.Register("TheProperty, typeof(string), typeof(TheClass), new PropertyMetadata(""));

public string TheProperty
{
  get { return (string)GetValue(ThePropertyProperty); }
  set { SetValue(ThePropertyProperty, value); }
}


Du gibst im PropertyMetadata Constructor den Default-Wert für die DependencyProperty an. Der sollte natürlich zum Rückgabetyp der DependencyProperty passen.

Getter und Setter der Property müssen so aussehen. Allerdings hat das direkt mit der Bindung nicht viel zutun, da eine Bindung direkt mit der DependencyProperty vollzogen wird und nicht mit dem Property-Getter/Setter-Konstrukt (wie immer man das nennt).

Falls eine Bindung nicht funktioniert, gibt das Programm eigentlich eine entsprechende Fehlermeldung in der Output Box des Debuggers aus. Kommt da was an?

//edit: vergiss den 1. Teil meiner Antwort, hab zwar deinen ganzen Beitrag gelesen, aber wohl nur den halben Beitrag auch verinnerlicht...

//edit 2: Du könntest das ganze als **CustomControl **machen (in der Hoffnung, dass das auch in Silverlight funktioniert, was ich noch nicht probiert habe). Als CustomControl leitest du dein Control statt von UserControl einfach (im Fall Label/TextBox/Image) von einem HeaderedContentControl ab. Damit hast du den Text des Labels in den Inhalt der TextBox schonmal erschlagen. Dann brauchst du nur noch die DependencyProperty für das ImageSource. Es gibt eine Vorlage für CustomControls im Add-Item-Wizard.

Schau einfach mal nach WPF und CustomControls. Da geisterten die Tage ein paar interessante Threads hier im Forum herum.

13.08.2009 - 14:36 Uhr

Jap, du kannste den TreeView sehr einfach rekursiv befüllen.

Die Frage die du dir stellen muss, ist nur, ob du bei jeder Rekursion wieder eine Datenbankabfrage starten willst.

Wenn du mit WPF arbeites, weißt du deinem Treeview ein HieraricatDataTemplate zu, indem du wiederrum über die Property ItemsSource bestimmst, wo dieser jeweils seine SubElemente herbeziehen soll.

Auf C# - Seite sieht es dann so aus, dass jedes Object ein Collectin-Property hat, welches z.B. Children heißt.
Dieses Collectin-Property steuert über die get-Methode, was geschen soll, wenn die Sub-Elemente angefragt werden.
Hier kannst du beliebigen Code reinschreiben (z.B. auch eine Datenbankabfrage, welche alle Elemente abfragt, welche als ParentId die Id des aktuellen Elementes haben).

OT: ich bin zwar kein Mod, aber bitte achte trotzdem mal darauf, dass du zumindest die Schlüsselbegriffe (Collection, HierarchicalDataTemplate) korrekt schreibst! Das vereinfacht die Suche und führt sonst zu Verwirrung.

13.08.2009 - 14:29 Uhr

Hochinteressantes Projekt!

Ich persönlich (Geschmackssache) bin für die <≤ Notation, rein aus optischen Überlegungen.

12.08.2009 - 15:08 Uhr

Okay, hab die Lösung gefunden:


CommandManager.RegisterClassCommandBinding(OwnerType, new CommandBinding(Command, OnCommand, OnCanExecute));

Das type-Argument, in meinem Beispiel OwnerType genannt, muss dem Typ des CommandSource entsprechen (oder einer dessen übergeordneten Klasse).

Laut MSDN muss OwnerType "die Klasse [sein], für die die commandBinding registriert werden soll."

Ah ja. Gut, dass das also die Klasse des Controls sein muss, die das Command zugewiesen bekommt, das war mir nicht bewusst.

12.08.2009 - 12:20 Uhr

Sorry für OT, aber Verständnisfrage: wenn ich aus einem Try-Block mit return aussteige, wird der Finally-Block also noch durchlaufen, bevor die Methode letztendlich zurückkehrt?

12.08.2009 - 11:49 Uhr

Äh, "finally"? Das gibt's doch nur in Verbindung mit 'nem Try-Catch-Block oder? Oder hab ich was verpasst?

12.08.2009 - 11:42 Uhr

Bei komplexeren Methoden muss man allerdings aufpassen, dass man wirklich an jedem möglichen Ausstiegspunkt ein return baut und vorher auch aufräumt, falls nötig.

Ich erinnere mich an meine zeit als C++ Entwickler, wo dann Speicherlecks entstanden, weil von meinen werten Kollegen an etlichen Stellen in riesigen unübersichtlichen Methoden _return_s, aber nicht überall _delete_s waren. Da blieben dann am Anfang der Methoden mit new angelegte Objekte einfach im Speicher liegen.

Okay, bei C# ist das nicht mehr so tragisch wegen des GC. Aber auch hier kann man damit Speicherlecks bauen, wenn man wild IDisposable Objekte anlegt (beim Arbeiten mit GDI+ zum Beispiel).

12.08.2009 - 11:34 Uhr

Gut, nach Herbivores Vorgehensweise kann man die "Junction" dann natürlich auch so bauen, was die Lesbarkeit tatsächlich noch erhöht:


SomeRetVal Junction(Whatever b)
{
        switch(b)
        {
                case Whatever.FooA:
                {
                        return DoSomeThingA();
                }
                case Whatever.FooB:
                {
                        return DoSomeThingB();
                }
                default:
                {
                        return DoSomeThingDifferent();
                }
        }
        return null; // wird auch wieder niemals erreicht. Sollte zumindest eine Compiler-Warning geben
}

12.08.2009 - 11:31 Uhr

In dem Fall würde ich wohl eine - ich nenn's mal - "Junction" Methode schreiben:



SomeRetVal Junction(Whatever b)
{
        SomeRetVal ret = null;
        switch(b)
        {
                case Whatever.FooA:
                {
                        ret = DoSomeThingA();
                        break;
                }
                case Whatever.FooB:
                {
                        ret = DoSomeThingB();
                        break;
                }
                default: 
                {
                        ret = DoSomeThingDifferent();
                        break;
                }
        }
        return ret;
}

Finde ich persönlich am schönsten (wie gesagt, Glaubensfrage). Die ganzen DoSomeThing... Methoden würde ich dann in eine #region packen.

12.08.2009 - 11:25 Uhr

Hi Leute,

hab mal wieder ein kleines Problem. Eigentlich sollte doch bei folgendem Code bei einer Anbindung an das RoutedCommand der besagte CanExecuteRoutedEventHandler ausgeführt werden, richtig?


        private static void InstallCommand(ref RoutedCommand Command, string Name)
        {
            Command = new RoutedCommand(Name, typeof(TCAMSettings));
            CommandManager.RegisterClassCommandBinding(typeof(TCAMSettings), new CommandBinding(Command, OnCommand, OnCanExecuteCommand));
        }

Die Methode rufe ich in einem statischen Constructor so auf:


        static TCAMSettings()
        {
            InstallCommand(ref mAddDeviceCommand, "AddDeviceCommand");
            InstallCommand(ref mRemoveDeviceCommand, "RemoveDeviceCommand");
        }

Wobei...


        private static readonly RoutedCommand mAddDeviceCommand;
        private static readonly RoutedCommand mRemoveDeviceCommand;

        public static RoutedCommand AddDeviceCommand { get { return mAddDeviceCommand; } }
        public static RoutedCommand RemoveDeviceCommand { get { return mRemoveDeviceCommand; } }

und...


<Button Command="{x:Static local:TCAMSettings.AddDeviceCommand}" Content="Click me!" />

und...


        static void OnCanExecuteCommand(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        static void OnCommand(object sender, ExecutedRoutedEventArgs e)
        {
                // TODO: Inhalt basteln
        }


Bloß wird OnCanExecuteCommand nie ausgeführt. Sagt jedenfalls der Debugger. Und der Button, an den ich das Command gebunden hab, ist immer ausgegraut.

Was fehlt hier (außer Ordnung im Beitrag)?

Danke!

Grüße,
Hendrik

//edit [14:43]: Ich muss vielleicht noch dazu sagen, dass TCAMSettings, also die Owner-Class des Commands von nichts explizit abgeleitet ist. Sie ist also kein Control oder sowas. Ist das von Belang?

12.08.2009 - 11:15 Uhr

Wobei Möglichkeit 2 unsinnig ist, da das letzte Return definitiv nie erreicht würde. Das müsste dir eigentlich sogar der Compiler sagen.

Daher würde ich die Methode so aussehen lassen:


string Foo(bool b) {
    return (b ? "baz" : "bar");
}

11.08.2009 - 21:26 Uhr

Es ist ein Browse Button, der ein OpenFileDialog aufrufen soll, dessen Rückgabe dann in einer ebenfalls eingebetteten Textbox hinterlegt werden soll (über eine an die Textbox gebundene DependencyProperty).

Dieser Vorgang soll innerhalb des Controls ablaufen, damit ein Benutzer des Controls das nicht jedesmal selbst neu verdrahten muss.

Commands sind wohl der gangbare Weg, das muss ich mir mal genau anschauen.