Data binding XAML-Syntax

Die Data Binding XAML-Syntax krankt an zu vielen impliziten und schlecht benannten Elementen. Diese machen es jedem schwer, die Funktionalität zumindest im Groben zu verstehen, ohne tiefer ins Thema einzutauchen. Daher im Folgenden eine Aufstellung an Data Binding Notationen mit Erläuterung:

Empty binding syntax

<ListBox ItemsSource="{Binding}"/>

In diesem Fall erbt ListBox den DataContext von einem übergeordneten DockPanel-Element (wird in diesem Beispiel nicht gezeigt). Wenn der Pfad nicht angegeben wurde, erfolgt die Bindung standardmäßig an das gesamte Objekt. (Quelle)

Path-property, explizit

<ListBox ItemsSource="{Binding Path=MyProperty}"/>

Aus dem DataContext, der weiter oben im XAML gesetzt wird, wird ein Property an die ListBox gebunden.

Path-property, implizit

<ListBox ItemsSource="{Binding MyProperty}"/>

Ist syntaktisch gleichbedeutend mit `Path-property, explizit` (Quelle).

Weiterführende Links:
https://msdn.microsoft.com/en-us/library/system.windows.data.binding.path.aspx
https://msdn.microsoft.com/en-us/library/ms742451.aspx

Einfachstes Beispiel für data-binding mit enum

Es gibt einige Stackoverflow-Threads (1 und 2), die sich damit beschäftigen, ein enum als Datenquelle für ein WPF-Control mit Hilfe von data-binding zu nutzen. Die meisten Lösungsansätze sind ziemlicher overkill und der Code nicht exakt ausgeführt, so dass sie nicht leicht zum Laufen gebracht werden können. Daher folgt nun ein ziemlich triviales Beispiel, welches exakt so läuft, wie es hier steht und aus nur zwei kleinen Dateien besteht:

In Visual Studio:
File -> New -> Project
Installed -> Templates -> Visual C# -> Windows -> WPF Application

1.) MainWindow.xaml.cs kann gelöscht werden.

2.) Der Code in MainWindow.xaml wird ersetzt durch:

<Window 
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:System="clr-namespace:System;assembly=mscorlib"
 xmlns:local="clr-namespace:MyExampleApplication"
 Title="Bind to Enum" Width="250" Height="100">
    <Window.Resources>
        <ObjectDataProvider x:Key="myEnumValues" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MyExampleEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <ComboBox ItemsSource="{Binding Source={StaticResource myEnumValues}}" />
    </Grid>
</Window>

3.) Neue Datei ‚MyExampleEnum.cs‘ erzeugen und folgenden Code eintragen:

namespace MyExampleApplication
{
    public enum MyExampleEnum
    {
        Red,
        Green,
        Yellow
    }
}

Und so sieht MyExampleApplication dann im Ergebnis aus:

enum data-binding wpf control

Tooltip in WPF-Anwendung (und DevExpress) erstellen

Ich erweitere diese Beispiel-WPF-Anwendung

… mit dem Tooltip-Property:
wpf anwendung tooltip

… und es funktioniert:
wpf anwendung tooltip 2

Ich habe die API-Doku stichprobenartig geprüft: alle Controls sind mit einem ToolTip-Property ausgestattet.

Dies gilt eigentlich auch für die DevExpress-Controls. Jedoch gibt es Konstellationen, in denen trotzdem kein Tooltip angezeigt wird/bzw. der Default-Tooltip nicht überschrieben wird. Jedes devexpress-control scheint da seinen eigenen Mechanismus zu haben, um den Tooltip zu etablieren:

BarButtonItem:

            <dxb:BarButtonItem x:Name="irgendeinButton">
                <dxb:BarButtonItem.SuperTip>
                    <dx:SuperTip>
                        <dx:SuperTipItem Content="mein Tooooooooltip"/>
                    </dx:SuperTip>
                </dxb:BarButtonItem.SuperTip>
            </dxb:BarButtonItem>

GridControl:

            <dxg:GridControl.ToolTip>
                <ToolTip>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="Meine erste Tooltip-Zeile"/>
                        <TextBlock Text="Meine zweite Tooltip-Zeile"/>
                    </StackPanel>
                </ToolTip>
            </dxg:GridControl.ToolTip>

Cell in GridColumn:

            <dxg:GridColumn FieldName="ParameterName">
                <dxg:GridColumn.CellStyle>
                    <Style>
                        <Setter Property="ToolTipService.ToolTip" Value="mein Tooooooooltip" />
                    </Style>
                </dxg:GridColumn.CellStyle>
            </dxg:GridColumn>

Baue eine triviale WPF-Application mit Visual Studio

In Visual Studio:

File -> New -> Project
Installed -> Templates -> Visual C# -> Windows -> WPF Application

Ersetze den Code in MainWindow.xaml durch:

<Window x:Class="MainWindow"
    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:WpfApplication2"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    >
    <StackPanel>
        <TextBlock Text="Enter some text">
        <TextBox x:Name="ResponseTextBox">
        <Button Content="OK" Click="OKButton_Click">
    </StackPanel>
</Window>

Ersetze den Code in MainWindow.xaml.cs durch:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public string ResponseText
    {
        get { return ResponseTextBox.Text; }
        set { ResponseTextBox.Text = value; }
    }

    private void OKButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        MessageBox.Show("You said: " + ResponseText);
    }
}

Abgeleitet aus: http://stackoverflow.com/a/2796487/1777526

Dann einfach starten und ausprobieren.
Weitere Controls kann man durch drag&drop aus der Toolbox in den XAML-Viewer hinzufügen.

„CSC (0,0) Source file ‚xyz.cs‘ could not be found“

Problem:
Nachdem ich einige .cs-Dateien gelöscht hatte und eine .cs-Datei umbenannt habe, wollte ich die Pending Changes schließlich einchecken. Die vom Gated Check-in ausgelösten builds schlugen jedoch fehl mit der Fehlermeldung:
„CSC (0,0)
Source file ‚xyz.cs‘ could not be found“

2016-09-30 15_19_56-Microsoft Team Foundation Server

Lösung:
Im Gated Check-in Fenster die Optionen aufklappen und „Bypass validation build and check in my changes directly (requires permissions)“ anhaken. Dann den Build via normalem MS Build Server Build starten. Offenbar hatte der Gated Check-in einige Codeänderungen nicht mitbekommen und daher fehlende Source files angemahnt.