2014-10-07 8 views
5

Dies ist ein ähnliches Problem zu WPF Binding : Casting in binding path, wo ich ein Objekt in einer XAML-Bindungsanweisung umwandeln muss. Aber ich kann nicht verstehen, wie man die Bindung in meinem speziellen Fall herstellt. Die Antwort auf diese Frage bezieht sich auf PropertyPath XAML Syntax, und der relevante Abschnitt ist (glaube ich) Single Property, Attached or Otherwise Type-Qualified.WPF-Casting im Bindungspfad

In meinem Fall in meiner Hauptansicht Modell Ich habe ein Wörterbuch, das Strings Objekte zuordnet, die eine Basis-Schnittstelle implementieren:

Dictionary<string, IFlintStone> FlintStones { get; set;} 

public interface IFlintStone { Walk, Talk etc} 
public class FlintStone : IFlintStone { .. } 

aber ich habe auch diese zusätzliche Aufgaben und Schnittstellen, das das Basisobjekt Unterklasse:

public interface IFred : IFlintStone { Eat, Drink, Yell etc } 
public interface IWilma : IFlintStone { Wash, Clean, Cook etc } 

public class Fred : FlintStone, IFred {..} 
public class Wilma : FlintStone, IWilma {..} 

Und schließlich bevölkern ich mein Wörterbuch wie:

FlintStones["Fred"] = new Fred(); 
FlintStones["Wilma"] = new Wilma(); 

Nun habe ich in meinem XAML ein Benutzersteuerelement zum Rendern eines Fred Objekts und eines weiteren zum Rendern eines Wilma Objekts. Ich kann den Datenkontext dieser Bedienelemente setzen so etwas wie tun:

<FredControl DataContext="{Binding Path=FlintStones[Fred]}" /> 
<WilmaControl DataContext="{Binding Path=FlintStones[Wilma]}" /> 

aber mein Verständnis ist, dass dies nur die IFlintStone Komponenten dieser Objekte zu ihren jeweiligen Bedienelemente aus. Aber ich mag die <WilmaControl>

Ist das möglich IFred zum <FredControl> und IWilma aufzudecken und was wäre die Bindung Syntax in diesem Fall sein?

Ideen aus den Link ich oben Bezug genommen wurde, ich habe Dinge ausprobiert wie:

<FredControl DataContext="{Binding path=(myns:Fred.FlintStones[Fred])}" /> 

und

<FredControl DataContext="{Binding path=(myns:Fred).FlintStones[Fred]}" /> 

(Wo myns eine Definition zeigt auf dem Fred Objekt in der Baugruppe XAML-Namespace ist .)

Aber das Programm entweder abstürzt und brennt beim Start, oder es beschwert sich, dass esnicht finden kannals eine Eigenschaft des aktuellen Datenkontextes.

Antwort

9

Hier ist eine Arbeitsversion meiner Interpretation Ihrer Frage:

MainWindow.xaml

<Window x:Class="WpfApplication22.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication22" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=FlintStones[Fred].FlintStone}" /> 
     <TextBlock Text="{Binding Path=FlintStones[Fred].(local:Fred.Yell)}" /> 
     <local:FredControl DataContext="{Binding Path=FlintStones[Fred]}" /> 
     <TextBlock /> 
     <TextBlock Text="{Binding Path=FlintStones[Wilma].FlintStone}" /> 
     <TextBlock Text="{Binding Path=FlintStones[Wilma].(local:Wilma.Clean)}" /> 
     <local:WilmaControl DataContext="{Binding Path=FlintStones[Wilma]}" /> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

using System.Windows; 
using System.Collections.Generic; 

namespace WpfApplication22 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public Dictionary<string, IFlintStone> FlintStones { get; set; } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      FlintStones = new Dictionary<string, IFlintStone>(); 
      FlintStones["Fred"] = new Fred(); 
      FlintStones["Wilma"] = new Wilma(); 

      this.DataContext = this; 
     } 
    } 

    public interface IFlintStone 
    { 
     string FlintStone { get; set; } 
    } 
    public interface IFred : IFlintStone 
    { 
     string Yell { get; set; } 
    } 
    public interface IWilma : IFlintStone 
    { 
     string Clean { get; set; } 
    } 

    public class Fred : IFred 
    { 
     public string FlintStone { get; set; } 
     public string Yell { get; set; } 

     public Fred() 
     { 
      FlintStone = "Fred Flintstone"; 
      Yell = "Yabba Dabba Doo"; 
     } 
    } 

    public class Wilma : IWilma 
    { 
     public string FlintStone { get; set; } 
     public string Clean { get; set; } 

     public Wilma() 
     { 
      FlintStone = "Wilma Flintstone"; 
      Clean = "Mammoth Dish Washer"; 
     } 
    } 
} 

FredControl.xaml

<UserControl x:Class="WpfApplication22.FredControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel Background="Beige"> 
     <TextBlock Text="{Binding FlintStone}" /> 
     <TextBlock Text="{Binding Yell}" /> 
    </StackPanel> 
</UserControl> 

WilmaControl.xaml

<UserControl x:Class="WpfApplication22.WilmaControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel Background="AntiqueWhite"> 
     <TextBlock Text="{Binding FlintStone}" /> 
     <TextBlock Text="{Binding Clean}" /> 
    </StackPanel> 
</UserControl> 

FredControl.xaml.cs und WilmaControl.xaml.cs sind unmodifizierte (nur InitializeComponent(); in den Konstruktoren).

Und ein Screenshot:

enter image description here

+0

Dies ist ein wirklich klares Beispiel für komplexe Bindung Syntax. Ich frage mich, ob IntelliSense funktioniert, wenn Sie es eingeben? –

+0

Die fehlende} 's war eine Über-Site .. Ich habe wirklich keine Klassen namens Fred und Wilma –

+0

@PeterM - Ich werde diesen Teil aus der Antwort entfernen. Ich denke, ich hätte das merken müssen. Natürlich kennen Sie die Bindesyntax. –

Verwandte Themen