2010-09-28 20 views
9

tengo este código detrás:WPF control de usuario genérico con código subyacente

CustomUserControl.xaml.cs

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

y esto 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> 

No funciona porque x: Class = "MyProject.CustomUserControl" no coincide con la definición de clase genérica del código subyacente. ¿Hay alguna forma de hacer que esto funcione?

Respuesta

8

Puede crear genérico " código detrás de "archivo sin archivo XAML:

public class CustomUserControl<T>: UserControl 
{ } 

y que derivar de ella proporcionando clase específica como parámetro:

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

XAML:

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

Por desgracia, parece que el diseñador de Visual Studio no es compatible con este tipo de medicamentos genéricos hasta que Visual Studio 2012 Actualización 2 (vea https://stackoverflow.com/a/15110115/355438)

4

No he encontrado mi solución en ningún otro lugar hasta el momento. La principal diferencia es que tengo un archivo .xaml para la clase de control de usuario genérico y no uno para cada control de usuario real.

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

que tipo de ver lo que está haciendo, pero yo no soy el mejor en la arquitectura XAML. ¿Cómo/dónde especifica cómo debería ser el control? Copié todo este código en un proyecto de prueba, pero no puedo: definir cómo debería ser, cómo usar este 'UserControl' en MainWindow.xaml y cómo vincular datos a él, p. enlaza 'MyGeneric (Of T)' con 'Label''s' Content'. –

+0

@Zach Escribí un pequeño ejemplo para ti. Eche un vistazo a [esto] (https://github.com/timmi-on-rails/GenericUserControlWPF). – Tom

Cuestiones relacionadas