none
Control de usuario RRS feed

  • Pregunta

  • Buenos dias, tengo un pequeña preguntilla con un Control de Usuario.

    En el control tengo una propiedad tal que asi:

    public ObservableCollection<Reserva> Datos
    {
         get { return (ObservableCollection<Reserva>)GetValue(DatosProperty); }
        set { SetValue(DatosProperty, value); }
    }
    
    public static readonly DependencyProperty DatosProperty =
                DependencyProperty.Register("Datos", typeof(ObservableCollection<Reserva>), typeof(Planificador), new PropertyMetadata(onDatosPropertyChange));
    
    private static void onDatosPropertyChange(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
         Planificador planificador = (Planificador)o;
         planificador.CrearFilasPrueba();
    }
    

    En el metodo tengo un punto de iterrupción para ver si realmente funciona. Y la pregunta es....

    ¿Por que cuando en codigo XAML asigno la propiedad, como

    <miControl:Control x:Name="Prueba" Datos={Binding ElementName = reservaDomainDataSource, Path=DataView}/>
    

    este no lanza la propiedad?, sin embargo si lo hago desde codigo .cs como, Prueba.Datos = reservaDomainDataSource.DataView, si que se para en el punto de iterrupcion. ¿Esto porque pasa?

    Gracias y un saludo!!!

     

    viernes, 30 de septiembre de 2011 7:59

Todas las respuestas

  • Hola Osc2009.

    ¿no se para ni siquiera la primera vez cuando se establece el enlace?

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 30 de septiembre de 2011 9:12
  • Hola David, que va. Lo que me extraña es que si lo hago por codigo si que se para, pero cuando es por XAML no para, y claro cuando quiero obtener el valor de esa propiedad me dice que es nula por que no llega a asignar el valor que le doy.
    viernes, 30 de septiembre de 2011 9:25
  • Hola osc2009.

    ¿Que tipo de control es reservaDomainDataSource?


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 30 de septiembre de 2011 9:50
  • Si, se me olvido mencionarlo, es un DomainDataSource, de los RIA Controls... No se si iran por ay los tiros... o que me falta algun tipo de marcado....
    viernes, 30 de septiembre de 2011 10:32
  • ¿puedes poner el codigo xaml donde se define el elemento?
    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 30 de septiembre de 2011 12:41
  • Pongo el codigo, tanto de Generic.xaml y el de mi Page.xaml

    Generic.xaml

    <ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Controles">
    
        <Style TargetType="local:Prueba">
            <Setter Property="ItemsSource" Value="{Binding Source={RelativeSource ItemsSource}}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:Prueba">
                        <Border Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition></RowDefinition>
                                </Grid.RowDefinitions>
                                <StackPanel Grid.Row="0">
                                    <Button x:Name="btn"></Button>
                                </StackPanel>
                                
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    

    y el de mi Page.xaml

    <navigation:Page
      x:Class="APLICACION_PRUEBAS.Home" 
      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:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
      mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"  
      Style="{StaticResource PageStyle}" xmlns:my="clr-namespace:Controles;assembly=Controles" xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" xmlns:my1="clr-namespace:APLICACION_PRUEBAS.Web.Services" xmlns:my2="clr-namespace:APLICACION_PRUEBAS.Web.Models" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    
      <Grid x:Name="LayoutRoot">
        <ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource PageScrollViewerStyle}">
    
          <StackPanel x:Name="ContentStackPanel" Style="{StaticResource ContentStackPanelStyle}">
    
            <TextBlock x:Name="HeaderText" Style="{StaticResource HeaderTextStyle}" 
                               Text="{Binding Path=Strings.HomePageTitle, Source={StaticResource ApplicationResources}}"/>
                    <my:Prueba Name="prueba1" Height="166" ItemsSource="{Binding ElementName=clienteDomainDataSource,Path=DataView,Mode=TwoWay}" />
                </StackPanel>
            
        </ScrollViewer>
            <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my2:Cliente, CreateList=true}"  Height="0" LoadedData="clienteDomainDataSource_LoadedData" Name="clienteDomainDataSource" QueryName="GetClientesQuery" Width="0">
                <riaControls:DomainDataSource.DomainContext>
                    <my1:datosDomainContext />
                </riaControls:DomainDataSource.DomainContext>
            </riaControls:DomainDataSource>
        </Grid>
    
    </navigation:Page>
    

    Lo que ya no se si el problema viene de Generic.xaml....

    Un saludo!!

    viernes, 30 de septiembre de 2011 14:22
  • Hola osc2009.
    Vale, por lo que veo, aqui no hay ningun problema, el funcionamiento es el esperado por las propiedades del binding, voy a intentar explicartelo:
    al crearse la propiedad de dependencia, se tiene que inicializar la propiedad del CLR a usar y esta se hace mediante el binding, de modo que al estar establecido el binding, la propiedad ya no es modificada y por lo tanto no se llama a la funcion callback.
    Hay que tener en cuenta que un cambio de propiedad realmente es un cambio de la referencia de la propiedad, por ejemplo si tu asocias inicialmente una coleccion, la modificacion de la coleccion no es un cambio de propiedad, solo lo es si creas una nueva propiedad y la asignas. De echo puedes poner un punto en el 'set' y veras como en ningun momento se modifica la propiedad.
    Ademas tienes que tener en cuenta que el DomainDataSource hereda de IEnumerable y no es un tipo generico, tu lo estas enlazando a un ObservableCollection<> que es un tipo generico, esto puede dar un comportamiento inesperado (en caso de no dar error), aunque es muy posible que se realice un cast interno, lo ideal es que siempre tengas en cuenta los datos de intercambio y realices un cast explicito que dejara la programacion mas clara.
    Aqui lo que veo, es que puedes intentar usar un conversor, no se exactamente lo que quieres hacer, pero es posible que te sirva, en cualquier caso te ayudara para depurar que datos te retorna el enlace y modificarlos en consecuencia.
    Puedes usar una clase como esta como conversor:
        public class converter : System.Windows.Data.IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var data = (DomainDataSourceView)value;
                return new ObservableCollection<users>(data.Cast<users>());
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {             
                throw new NotImplementedException(); 
            }
        }
    
     
    y para el enlace, insertar en los recursos la clase :
    <local:converter x:Key="converter1" />
    

     y luego para el binding:
    Binding ElementName=domainDataSource1, Path=DataView, Converter={StaticResource converter1}}
    
    (Obviamente poniendo nombres mas adecuados)
     
    Con esto puedes ver mucho mas claro que se hace en el binding, pero no te servira de mucho, ya que no esta directamente enlazado el IEnumerable de resultados con la propiedad que tu creas y en ese momento no existiran datos, de modo que no vas a tener ningun dato que retorne luego el servicio RIA.
     
    El caso es que hay que tener varias cosas en cuenta con los bindings.
    Por eso veras que los controles que hacen uso del DomainDataSource hacen uso de la propiedad Items que es un ItemCollection y hereda de varios tipos de colecciones e interfaces no genericos como IEnumerable, de modo que les otorgan esa flexibilidad. 
     
     Si comentas que quieres hacer exactamente igual te puedo ayudar algo mejor

    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    domingo, 2 de octubre de 2011 19:25
  • Buena respuesta si señor jajajaja. La verdad qe voy a leerlo con detenimiento para poder empaparlo mejor. Pues realmente lo que queria hacer es una especie de planning para un hotel. He visto uno que hay en Codeplex, un scheduler, pero para lo que quiero es demasio complejo. Lo que queria hacer es un control personalizado en el que stableces una propiedad Itemssource, y ay le pasas una tabla y automaticamente te genere las columnas o filas de esa tabla en concreto. Lo mismo es algo mas complejo que todo eso, pero lo queria intentar.....
    lunes, 3 de octubre de 2011 10:29
  • Hola osc2009.

    No se como has implementado el control personalizado, pero es posible que lo que quieres hacer lo implementes de forma muy sencilla si heredas de ItemsControl, ya que tiene la propiedad Items para manejar colecciones de objetos.

    Tienes mas informacion en la MSDN:

    http://msdn.microsoft.com/es-es/library/system.windows.controls.itemscontrol.aspx

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta CorsarioVasco lunes, 3 de octubre de 2011 14:23
    lunes, 3 de octubre de 2011 13:23