2010-09-28 12 views
9

ho questo codice dietro:WPF UserControl con il generico code-behind

CustomUserControl.xaml.cs

namespace MyProject 
{ 
    public partial class CustomUserControl<T> : UserControl 
    { 
     ... 
    } 
} 

e questo XAML:

CustomUserControl.xaml

<UserControl x:Class="MyProject.CustomUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
<Grid> 

</Grid> 

Non funziona poiché x: Class = "MyProject.CustomUserControl" non corrisponde alla definizione di classe generica del code-behind. C'è un modo per farlo funzionare?

risposta

8

È possibile creare generico " file "code-behind" senza file XAML:

public class CustomUserControl<T>: UserControl 
{ } 

e di ricavare da esso fornendo classe specifica come parametro:

public partial class SpecificUserControl : CustomUserControl<Presenter> 
{ 
    public SpecificUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

XAML:

<application:CustomUserControl 
    x:TypeArguments="application:Presenter" 
    xmlns:application="clr-namespace:YourApplicationNamespace" 
... 

Purtroppo, sembra che Visual Studio progettista non supporta tali farmaci generici fino a Visual Studio 2012 Aggiornamento 2 (vedere https://stackoverflow.com/a/15110115/355438)

4

Non ho trovato la mia soluzione da nessun'altra parte fino ad ora. La differenza principale è che ho un file .xaml per la classe di controllo utente generica e non uno per ciascun controllo utente effettivo.

GenericUserControl.xaml.cs

using System.Windows.Controls; 

namespace TestGenericUserControl 
{ 
    public abstract partial class GenericUserControl : UserControl 
    { 
     // If you use event handlers in GenericUserControl.xaml, you have to define 
     // them here as abstract and implement them in the generic class below, e.g.: 

     // abstract protected void MouseClick(object sender, MouseButtonEventArgs e); 
    } 

    public class GenericUserControl<T> : GenericUserControl 
    { 
     // generic properties and stuff 

     public GenericUserControl() 
     { 
      InitializeComponent(); 
     } 
    } 

    // To use the GenericUserControl<T> in XAML, you could define: 
    public class GenericUserControlString : GenericUserControl<string> { } 
    // and use it in XAML, e.g.: 
    // <GenericUserControlString /> 
    // alternatively you could probably (not sure) define a markup extension to instantiate 
    // it directly in XAML 
} 

GenericUserControl.xaml

<UserControl x:Class="TestGenericUserControl.GenericUserControl" 
     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"> 
    <Grid> 
     <Label Content="hello" /> 
    </Grid> 
</UserControl> 
+0

I tipi di vedere quello che stai facendo, ma io non sono il migliore in architettura XAML. Come/dove si specifica come dovrebbe essere il controllo? Ho copiato tutto questo codice in un progetto di prova, ma non sono in grado di: definire come dovrebbe essere, come usare questo 'UserControl' in MainWindow.xaml e come associare i dati ad esso, ad es. legare 'MyGeneric (Of T)' a 'Label''s' Content'. –

+0

@ Zach Ho scritto un piccolo esempio per te. Dai un'occhiata a [questo] (https://github.com/timmi-on-rails/GenericUserControlWPF). – Tom

Problemi correlati