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 snupi
Thema: DialogResult (null) mit SendMessage ?
Am im Forum: GUI: WPF und XAML

Der Hintergrund ist folgender: ich öffne in einer WPF-Anwendung eine View mit ShowDialog, welche nur einen OK-Button hat. Dieser sollte beim Öffnen der View disabled sein, und erst bei im weiteren Verlauf auf enabled geschalten werden (die View bleibt aber immer offen) - ich habe hier schon mit Dependency-Properties gespielt... daher war meine Idee, die View zuerst mit inaktiven OK-Button zu öffnen, dann programmatisch (SendMessage, WM_CLOSE) zu schliessen und wieder mit aktvien OK-Button zu öffnen ...

Thema: DialogResult (null) mit SendMessage ?
Am im Forum: GUI: WPF und XAML

Kann ich aber mit SendMessage OK oder CANCEL schicken ?

Thema: DialogResult (null) mit SendMessage ?
Am im Forum: GUI: WPF und XAML

Wie kann ich None senden (SendMessage) ?

Thema: DialogResult (null) mit SendMessage ?
Am im Forum: GUI: WPF und XAML

Wie kann ich mit SendMessage einer View, welche mit ShowDialog geöffnet wurde, ein DialogResult = null senden (damit ich sie im Programm gezielt mit einem ResultCode schliessen kann - WM_CLOSE liefert DialogResult = Cancel) ?

Thema: Deserialisierung XML-String mit xxxSpecified Field ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

habe nun bissi getestet und es muss das XmlElement()-Attribut gesetzt sein, dann wird auch xxxSpecified gesetzt

Thema: Deserialisierung XML-String mit xxxSpecified Field ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich deserialisiere einen xml-String auf die Klasse 'Dummy'.

Im xsd ist das Feld 'num' mandatory und das Feld 'str' optional (minOccurs=0)


public class Dummy {
   int numField;
   string strField;
   bool strFieldSpecified;

   public int num {
       get {
           return this.numField;
       }
       set {
           this.numField = value;
       }
   }

   public string str {
       get {
           return this.strField;
       }
       set {
           this.strField = value;
       }
   }

   [System.Xml.Serialization.XmlIgnoreAttribute]
   public bool strSpecified {
       get {
           return this.strFieldSpecified;
       }
       set {
           this.strFieldSpecified = value;
       }
   }
}

Kann man den (De)Serializer veranlassen, den Wert xxxSpecified automatisch zu setzen ?

Ich kann natürlich den Wert beim Setzen der zugehörigen Property selbst setzen, nur müsste ich dann alle optionalen Elemente manuel erweitern:


   public string str {
       get {
           return this.strField;
       }
       set {
           this.strField = value;
           this.strFieldSpecified = true;
       }
   }


Bei WCF Services habe ich bemerkt, dass diese Specified-Felder automatisch gesetzt werden...

Thema: Zugriff auf Programm-Folder verweigert.
Am im Forum: Rund um die Programmierung

Habe eine Applikation, welche in den Programm-Folder installiert wird (C:\Program Files (x86)\...').

Dieses Programm versucht ein File (config-File) im Ausführungs-Ordner zu öffnen (ReadOnly).

Bekomme hier aber die Fehlermeldung:

Fehler
Access to the Path 'C:\Program Files (x86)\...' id denied

Wie kann ich hier den Zugang erteilen ?

Eine Möglichkeit wäre, das File in SpecialFolder.ApplicationData abzulegen - nur wie kann ich diese in Visual Studio referenzieren ?

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

@herbivore : ja das ist mir klar :)

Ich habe mir 2 StateObjecte jeweils für Lesen und Schreiben erstellt, welche ich jeweils in BeginRead/BeginWrite mitsende.

Da MSDN folgendes sagt:

Zitat
Lese- und Schreibvorgänge können gleichzeitig in einer Instanz der NetworkStream-Klasse ausgeführt werden, ohne dass eine Synchronisierung erforderlich ist.

hat jedes StateObject jeweils den selben NetworkStream, welches es zum Lesen bzw. Schreiben verwenden kann...

@weismat : genau für diesen Grund synche ich dann 'ausserhalb' mittels einer Write(Snyc)-Queue.

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

Verwende nun das asynchrone Muster mit NetworkStream.BeginRead/NetworkStream.BeginWrite Ohne Synchronisierung - konnte in meinen Dauertests (heftiges, gleichzeitiges Lesen/Schreiben) bis dato keine Probleme feststellen.

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

@weismat:

MSDN sagt folgendes:

Zitat
Lese- und Schreibvorgänge können gleichzeitig in einer Instanz der NetworkStream-Klasse ausgeführt werden, ohne dass eine Synchronisierung erforderlich ist.Unter der Voraussetzung, dass ein eindeutiger Thread für Schreibvorgänge und ein eindeutiger Thread für Lesevorgänge vorhanden sind, überschneiden sich die Lese- und Schreibthreads nicht, und es ist keine Synchronisierung erforderlich.

soviel ich sehe, habe ich keine Überschneidung von Lese- und Schreibthreads

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

Hi herbivore

Zitat
innerhalb eines locks eine Operation zu verwenden, die beliebig lange blockieren kann, ist immer gefährlich. Wenn diese Operation dann auch noch von einem anderen Thread abhängt, der auf das lock wartet, gibt es - wie du vermutet hast - einen Deadlock.

Das wäre in meinem Code ja aber nicht der Fall (Die Operation hängt nicht von einem anderen Thread ab - oder sehe ich hier was falsch) ?

SendMessage kann von mehreren Threads aufgerufen werden, da es eine BroadCast-Funktion gibt, welche an alle verbundenen Client was schicken kann.
Dies habe ich nun mittels ein SafeQueue gelöst, dh. das SendMessage stellt die Messages nur mehr in die Queue, ein Thread in AppClient kümmert sich dann um das Senden der Messages aud dieser Queue.

So wie ich das dann aus der MSDN (NetworkStream) verstehe, brauche ich dann keinen lock mehr (SenderThread, ReadCallback), da Read/Write auf einen NetworkStream gleichzeitig ausgeführt werden darf.

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

Ich kann mir ja bei der Instanzierung auch gleich den NetworkStream speichern und dann nur mehr den verwenden... :

Im Konstruktor:


...
_ns = _client.GetStream();
...

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

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

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

Ich habe nun eine erste Version, welche mehr oder weniger gut funktioniert:

Am Server gibt es pro verbundenem Client eine Instanz von AppClient, welche den zugehörigen TcpClient (_client, aus TcpListener.AcceptTcpClient()) erhält.

AppClient kann mittels SendMessage Daten senden:


        void SendMessage(string msg) {
            try {
                //lock (_client.GetStream()) {
                    NetworkStream ns = _client.GetStream();
                    byte[] bytesToSend = Encoding.ASCII.GetBytes(msg);
                    ns.Write(bytesToSend, 0, bytesToSend.Length);
                    ns.Flush();
                //}
            } catch (Exception) {
            }
        }

Das Empfange von Nachrichten erfolgt asynchron mittels BeginRead:


        void ReadCallback(IAsyncResult ar) {
            int bytesRead;
            try {
                //lock (_client.GetStream()) {
                    bytesRead = _client.GetStream().EndRead(ar);
                    //}
                if (bytesRead < 1) {
                    return;
                } else {
                    string msg;
                    int i = 0;
                    int start = 0;
                    while (i + 1 ≤ bytesRead) {
                        if (_buffer[i] == '\n') {
                            msg = _partialStr + Encoding.ASCII.GetString(_buffer, start, i - start);
                            _partialStr = String.Empty;
                            
                            //..do stuff
                            start = i + 1;
                        }
                        i += 1;
                    }

                    if (start != i) {
                        _partialStr = Encoding.ASCII.GetString(_buffer, start, i - start);
                    }
                }
                //lock (_client.GetStream()) {
                    _client.GetStream().BeginRead(_buffer, 0, _buffer.Length, ReadCallback, null);
                //}
            } catch (Exception) {
            }
        }

In meinen Test habe ich auch Stresstest gemacht, welche alle 10ms Daten senden, empfangen und wieder zurücksenden...

Dabei ist mir aufgefallen, wenn ich die einkommentierten lock-Anweisungen verwende, steht das System irgendwann still (ich nehme an, ein DeadLock).

Ohne den lock-Anweisungen funktioniert es...

Sind die lock-Anweisungen überhaupt notwendig ?

laut msdn:
Zitat von MSDN
Lese- und Schreibvorgänge können gleichzeitig in einer Instanz der NetworkStream-Klasse ausgeführt werden, ohne dass eine Synchronisierung erforderlich ist.Unter der Voraussetzung, dass ein eindeutiger Thread für Schreibvorgänge und ein eindeutiger Thread für Lesevorgänge vorhanden sind, überschneiden sich die Lese- und Schreibthreads nicht, und es ist keine Synchronisierung erforderlich.

Thema: XML Serialisierung Parent/Child: Überflüssige Attribute in den XML-Tags vermeiden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Danke - ich habs in der Zwischenzeit schon mal händisch umgesetzt.

Thema: XML Serialisierung Parent/Child: Überflüssige Attribute in den XML-Tags vermeiden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich habe eine Baseklasse MyBase und eine davon abgeleitete MyChild : MyBase.

Wenn ich nun MyChild serialisiere, bekomme ich folgenden Output:


<?xml version="1.0" encoding="utf8"?>
<MyBase baseNumber="1" d1p1:type="MyChild" xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance">
  <number>2</number>
</MyBase>

ich hätte aber gerne folgenden output:

<?xml version="1.0" encoding="utf8"?>
<MyBase baseNumber="1">
  <MyChild>
    <number>2</number>
  </MyChild>
</MyBase>

kann ich das durch Dekorieren (XML-Attributes) meiner objekte MyBase,MyChild erreichen ? dekorieren ?

Thema: ToggleButton im UserControl: RoutedEvent oder ICommand ?
Am im Forum: GUI: WPF und XAML

a ok muss ich ausprobieren

Thema: ToggleButton im UserControl: RoutedEvent oder ICommand ?
Am im Forum: GUI: WPF und XAML

@uwalter: MVVM Light Toolkit muss ich mir mal genauer anschauen - danke für den tip.
@ErfinderDesRades: die IsChecked-Property des RadioButtons muss ich aber dann halt nochmals im UserControl abbilden (um sie von aussen zugänglich zu machen)

Thema: MVVM Starthilfe
Am im Forum: GUI: WPF und XAML

Zitat
Für dieses Primitiv-Beispiel ists unpassend, Model und ViewModel auseinanderzudröseln - das Model soll sein PropertyChanged senden, wenns die Property Changed, und daran kann Xaml gebunden werden, und gut.

Ich hätte einfach den Zeitgeber ins ViewModel gegeben und dieses dann an XAML gebunden ...

Update: Der Zeitgeber ist nun ein eigenes Model, da ich diesen um einige Funktionalität erweiter habe und in anderen Projekten noch verwende.
Der Zeitgeber hat nun ein TimeChanged-Event. Der Handler dafür im ViewModel setzt das entsprechende Property für die View (inkl. Formatierung der Zeit).

Thema: ToggleButton im UserControl: RoutedEvent oder ICommand ?
Am im Forum: GUI: WPF und XAML

Ich habe in einem UserControl einen RadioButton (Style=ToggleButton). Um die View (bzw. das ViewModel) über den Checked-Status zu informieren, habe ich ein RoutedEvent bereitgestellt (CheckedChangedEvent), welches im Checked-Eventhandler des RadioButtons ausgelöst wird:


        private void rdBtn_Checked(object sender, RoutedEventArgs e) {
            RoutedPropertyChangedEventArgs<bool> args =
                new RoutedPropertyChangedEventArgs<bool>(false, true);
            args.RoutedEvent = CheckedChangedEvent;

            RaiseEvent(args);
        }

Im Code-Behind der MainView, welches das UserControl beinhaltet, rufe ich dann im CheckedChangedEventHandler eine entsprechende Funktion im MainViewModel auf.

Das funktioniert soweit so gut.

Nun habe ich dem UserControl (genauer gesagt dem RadioButton) auch die Möglich eines Commands verpasst:

    <RadioButton Name="rdBtn"
                 Command="{Binding SomeCommand, ElementName=rootControl}" CommandParameter="{Binding ElementName=rootControl, Path=Name}" Style="{StaticResource {x:Type ToggleButton}}" GroupName="{Binding ElementName=rootControl,Path=GroupName}" Checked="rdBtn_Checked">
    </RadioButton>
Weise ich in der MainView dem UserControl nun ein eigenes Command zu:

<local:MyUC Name="dummy" SomeCommand="{Binding BtnCommand}" />
dann wird dieses Command bei jedem Click auf den Button ausgeführt, auch wenn dieser bereits 'Checked' ist.

Hinsichtlich MVVM:

Ist es hier sinnvoller, die Variante mit dem RoutedEvent zu nehmen oder lässt sich die Variante mit dem ICommand so modifizieren, dass das Command nur bei IsChecked=False exekutiert wird ?

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

@michlG : ich habe die Beispiele wieder in ihren Ausgangszustand versetzt - nichtsdestotrotz funktionieren diese wie gesagt nur dann, wenn im Button der Background gesetzt wird...

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

@michlG : Antwort ist mir leider nicht klar. Der TargetName wird ja immer gesetzt (button1)...

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

Ok dachte es war klar was ich meine ...

Hier nochmal die Varianten, welche NICHT funktionieren:


<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
         </Button>
     </Grid>
 </Window> 

<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
            <Button.Background>
                 <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                     <GradientStop Color="#FFF3F3F3" Offset="0"/>
                     <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                     <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                     <GradientStop Color="#FFCDCDCD" Offset="1"/>
                 </LinearGradientBrush>
             </Button.Background> 
         </Button>
     </Grid>
 </Window> 

Und hier die Variante, welche funktioniert:


<Window x:Class="WpfPlayGround.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="300" Width="300">
     <Grid>
         <Button Name="button1" Focusable="False" Background="Gray" Width="100" Height="100">
             <Button.Triggers>
                 <EventTrigger RoutedEvent="Button.Click">
                     <BeginStoryboard>
                         <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                             <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Background.Color">
                                 <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                 <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                             </ColorAnimationUsingKeyFrames>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
             </Button.Triggers>
         </Button>
     </Grid>
 </Window> 

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

"beides": ich meinte, beide Varianten (1. und 2. Beispiel mit TargetName und TargetProperty)

"Explizites Setzen": Setzen des Backgrounds im Button. Nur wenn dieser im Tag 'Button' gesetzt wird, verschwindet die Exception.

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

Haut leider beides nicht hin ... nur das explizite Setzen eines Backgrounds lässt die Exception verschwinden.

Thema: UserControl Background blinken lassen ?
Am im Forum: GUI: WPF und XAML

Ich habe das Blinken nun mal ausgelagert zum Testen:


<Window x:Class="WpfPlayGround.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Button Name="button1" Focusable="False" Background="Gray" Width="100" Height="100">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard TargetName="button1" Duration="0:0:1" RepeatBehavior="Forever">
                            <ColorAnimationUsingKeyFrames Name="myColorAnimationKeyFrames" Storyboard.TargetProperty="Background.Color">
                                <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red" />
                                <DiscreteColorKeyFrame KeyTime="0:0:0.5" Value="Blue" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </Grid>
</Window>

Das Blinken funktioniert nur mit einem gesetzten Background im Button. Falls ich den Background weglasse, bekomme ich die Exception '{"Cannot resolve all property references in the property path 'Background.Color'. Verify that applicable objects support the properties."}'.

Auch das Setzen eines Brushes wie folgt führt zu obiger Exception:

            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                    <GradientStop Color="#FFF3F3F3" Offset="0"/>
                    <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                    <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                    <GradientStop Color="#FFCDCDCD" Offset="1"/>
                </LinearGradientBrush>
            </Button.Background>

Ich möchte den Style des Button so lassen wie er ist (ohne setzen vin Background, dh standardmässig mit Verlauf, wenn man ihn im Designer plaziert) - aber dennoch Blinken lassen...

Thema: MVVM Starthilfe
Am im Forum: GUI: WPF und XAML

Ich weiss, das Beispiel ist zu simple für ein MVVM, da ich den Zeitgeber direkt ins ViewModel geben kann - ich will aber nur mal grundsätzlich alle Teile eines MVVM-Musters behandeln.

Was mich hier nur stört, ist die Tatsache, dass ich im ViewModel 'umständlich' auf den geänderten Wert des Property's kommen muss. Wenn mein Model zb. mehrere Propertys hätte, bräuchte ich im ViewModel schon einen Switch im Handler (_dateTimeM_PropertyChanged()).

In einigen Lektüren habe ich auch gelesen, dass auch das Model ein ViewModel besitzen sollte ... ?

Thema: MVVM Starthilfe
Am im Forum: GUI: WPF und XAML

ok, habe vergessen zu erwähnen, dass ich im ViewModelBase nur das Interface 'INotifyPropertyChanged' implementiere:


    public abstract class ViewModelBase : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName) {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null) {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

Wollte mir hier im Model nur Schreibarbeit ersparen...

Thema: MVVM Starthilfe
Am im Forum: GUI: WPF und XAML

Ich checke auch zur Zeit das MVVM-Muster anhand eines einfachen Beispiels - eben genau auch mit einer Uhr:

dafür habe ich das DateTimeModel:


    class DateTimeModel : ViewModelBase {
        DateTime _now;

        public DateTimeModel() {
            DispatcherTimer timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate {
                Now = DateTime.Now;
            }, Dispatcher.CurrentDispatcher);
            timer.Start();
        }

        public DateTime Now {
            get {
                return _now;
            }
            set {
                if (_now != value) {
                    _now = value;
                    OnPropertyChanged("Now");
                }
            }
        }
    }

ich update hiermit ein Label in einem Window (MyView). MyView besitzt ein ViewModel 'MyViewModel'.

Zuvor muss 'Now' aus dem DateTimeModel noch formatiert werden (ToString()). Soll hier noch ein ViewModel (laut MVVM) für das DateTimeModel werden, oder übernimmt das 'MyViewModel' ?

Was mich noch irritiert ist die Tatsache, dass das DateTimeModel 'INotifyPropertyChanged' (über ViewModelBase) implementiert. MyViewModel muss dies für das Feld 'Now' (formattiert) natürlich auch machen, um die View zu informieren. Das MyViewModel muss aber irgendview auf den Wert des Propertys kommen - geht natürlich, aber hier verletze ich meiner Meinung nach das MVVM-Muster ... :


    public class MyViewModel : ViewModelBase {
        DateTimeModel _dateTimeM;
        string _now;

        #region Constructor
        
        public MyViewModel() {
            _dateTimeM = new DateTimeModel();
            _dateTimeM.PropertyChanged += _dateTimeM_PropertyChanged;
        }

        void _dateTimeM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
            var property = sender.GetType().GetProperty(e.PropertyName);
            Now = ((DateTime)property.GetValue(sender, null)).ToString("dd'/'MM'/'yy HH:mm:ss");
        }

        public string Now {
            get {
                return _now;
            }
            set {
                if (_now != value) {
                    _now = value;
                    OnPropertyChanged("Now");
                }
            }
        }
    }

Alternativ könnte ich das DateTimeModel mit einem Event ausstatten, damit ich den Wert von Now direkt erhalte:


class DateTimeModel {
        public delegate void TimeChangedHandler(DateTime dt);
        public event TimeChangedHandler TimeChanged;

        void OnTimeChanged(DateTime dt) {
            if (TimeChanged != null)
                TimeChanged(dt);
        }

        public DateTimeModel() {
            DispatcherTimer timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate {
                OnTimeChanged(DateTime.Now);
            }, Dispatcher.CurrentDispatcher);
            timer.Start();
        }

        }
    }

Thema: TwoWay - TCP Kommunikation (Request/Response)
Am im Forum: Rund um die Programmierung

Zitat von weismat
Folgende Punkte wuerde ich Dir empfehlen:
  • Im Protokoll zwischen Client und Server wuerde ich einen Kontext oder eine Request-Nummer einfuegen, so dass der Client anhand des Kontext den zugehoerigen Request zu der Response wiederfinden kann.

@weismat: das ist bereits mit der messageId vorgesehen ;)