C# / WPF ObservableDictionary

Leider sieht das .NET Framework bisher keine native Implementierung für ein ObservableDictionary vor. Wer trotzdem das Dictionary Pendant zur ObservableCollection haben möchte, muss dieses selbstständig implementieren. Im selben Zug sollte auch ein ObservableKeyValuePair als Pendant zum KeyValuePair implementiert werden. Hierbei sollten die beiden Events CollectionChanged sowie PropertyChanged implementiert werden. Um das Ganze zu realisieren, sollte also zunächst ein ObservableKeyValuePair implementiert werden. Hierbei gibt es verschiedene Möglichkeiten. Ich persönlich bevorzuge hierbei die Verwendung einer sealed class. Natürlich sollte es auch serialisierbar sein und möglichst in jedem Projekt verwendet werden können.  Weiterlesen

RadioButtons und Binding in .NET 3.5

Im .NET-Framework 3.5 haben RadioButtons eine merkwürdige Eigenschaft. Sie überschreiben das Binding der IsChecked Property beim Uncheck. Da dies nur in den seltensten Fällen gewollt sein kann, dass sich das Binding verabschiedet, wurde dies im .NET 4.0 behoben. Aber auch unter .NET 3.5 kann der Fehler mit Hilfe eines kleinen Workarounds umgangen werden. Hierzu muss nur eine eigene RadioButton-Klasse erstellt werden, welche ein paar Dinge mit sich bringt. Anschließend wird in der Anwendung das Binding nicht mehr bei der Property „IsChecked“ sondern bei der Property „IsCheckedBinding“ gesetzt. Hier der benötigte Code zum eigenen Control:

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

public class DataBoundRadioButton : RadioButton
{
    private static bool _isChanging;

    public static readonly DependencyProperty IsCheckedBindingProperty =
            DependencyProperty.Register("IsCheckedBinding", typeof(bool), typeof(DataBoundRadioButton),
            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsCheckedBindingChanged));
        
    public bool IsCheckedBinding
    {
        get { return (bool) GetValue(IsCheckedBindingProperty); }
        set { SetValue(IsCheckedBindingProperty, value); }
    }

    public DataBoundRadioButton()
    {
        Checked += OnChecked;
        Unchecked += OnUnchecked;
    }

    private void OnChecked(object sender, RoutedEventArgs e)
    {
        if (!_isChanging)
            IsCheckedBinding = true;
    }

    private void OnUnchecked(object sender, RoutedEventArgs e)
    {
        if (!_isChanging)
            IsCheckedBinding = false;
    }

    private static void IsCheckedBindingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        _isChanging = true;
        ((DataBoundRadioButton)d).IsChecked = (bool)e.NewValue;

        _isChanging = false;
    }
}

Administratorrechte für eine Anwendung erforderlich machen

Es gibt Fälle, in denen man nicht darum herumkommt, für eine Anwendung Administratorrechte erforderlich zu machen. Egal, welche Sprache man wählt, immer kann es nötig sein Aktionen durchzuführen für die mehr Rechte erforderlich sind, als die eines normalen Benutzers. Im Visual Studio kann man hierfür der Anwendung einfach eine Manifest-Datei hinzufügen. Diese Anwendungsmanifest-Datei ist eine simple XML-Struktur. Weiterlesen

Mit C# in der Windows-Ereignisanzeige schreiben

Wenn es um das Thema „Logging“ geht, gibt es bei C# beliebig viele verschiedene Ansätze. Neben den weit verbreiteten Logging-„Frameworks“ wie u.a. log4net, besteht in C# ebenfalls die Möglichkeit in den Windows-„Log“ (im Deutschen Ereignisanzeige) seine Fehler und andere Probleme abzulegen. Aber was wird benötigt, um dorthin schreiben zu können? Nun zunächst muss die Anwendung, um dorthin schreiben zu können, seit Windows Vista im Administrator Modus laufen. Wie man dies für die Anwendung voraussetzen kann, folgt noch in einem weiteren Blog-Post, lässt sich aber auch schnell mittels Google lösen. Stichwort: Manifest. Weiterlesen

C# 6.0 – Dictionary Initialisierung

Mit C# 6.0 lassen sich auch Dictionaries direkt initsialisieren. Dabei spielt es auch keine Rolle welche Typen verwendet werden. Da hier nicht viel Erklärungbedarf bestehen dürfte, hier ein selbsterklärendes Beispiel (es werden Zeilennummern C++ Quellcodezeilen zugewiesen und im Dictionary gespeichert):

Dictionary<int, string> CppHelloWorldProgramCode = new Dictionary<int, string>
    {
        [1] = "#include <iostream>", 
        [2] = "", 
        [3] = "int main () {", 
        [4] = "  std::cout << \"Hello World!\" << std::endl;", 
        [5] = "  return 0;", 
        [6] = "}"
    };

C# 6.0 – Wie heißt du denn?

Um in C# 6.0 zu erfahren, wie eine Variable im Quellcode heißt, gibt es das neue Schlüsselwort „nameof„. Mit dessen Hilfe kann z.B. ein Umbennen von Variablen, welche anschließend im Logging oder Exception-Text (-Parameter) verwendet werden, so gestaltet werden, dass der Kompiler einen Fehler ausgibt, wenn die Bezeichnung nicht stimmt. Hier ein Beispiel:

public void DoSomething(string someValue)
{
    if (string.IsNullOrEmpty(someValue))
        throw new ArgumentException(nameof(someValue), $"A value for parameter \"{nameof(someValue)}\" is required!");

    // Do some stuff here
}

Und so reiht sich die neue Funktionalität wunderbar in der Sammlung positiver Aspekte von  C# ein.