update test para mac kendo ejemplos demos c# silverlight telerik

c# - test - ¿Cómo puedo vincular o de otra manera obtener y establecer un valor de control en un recurso?



test silverlight (2)

¿Cómo puedo vincular un control dentro de un recurso de control de usuario a una propiedad? Alternativamente, ¿puedo encontrar el control desde el código y obtener y establecer el valor desde allí?

Aquí está mi marcado. Lo he desglosado solo a la parte relevante:

Salesmen.xaml:

<UserControl.Resources> <ControlTemplate x:Key="EditAppointmentTemplate1" TargetType="local:SchedulerDialog" x:Name="ControlTemplate"> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <Grid> <Grid Name="grdTotal" Grid.Row="4" Visibility="{Binding ResourceTypesVisibility}"> <TextBox x:Name="totalSalesmen" Grid.Row="0" Grid.Column="1" Margin="3" Width="120" Text="{Binding Parent.totalSalesmen, ElementName=LayoutRoot, Mode=TwoWay}" /> </Grid> </ScrollViewer> </ControlTemplate> <Style x:Key="EditAppointmentDialogStyle1" TargetType="local:SchedulerDialog"> <Setter Property="Template" Value="{StaticResource EditAppointmentTemplate1}" /> </Style> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Left" Margin="10,10,0,0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel Orientation="Vertical"> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" BorderBrush="Transparent"> <telerik:RadCalendar Name="RadCalendar" SelectedDate="{Binding CurrentDate, ElementName=RadScheduleViewTests, Mode=TwoWay}" IsTodayHighlighted="True" telerik:StyleManager.Theme="Metro" HorizontalAlignment="Left" VerticalAlignment="Top" FirstDayOfWeek="Sunday" Margin="0,0,15,0" SelectionChanged="RadCalendar_SelectionChanged_1" > </telerik:RadCalendar> </ScrollViewer> </StackPanel> <telerik:RadScheduleView Name="RadScheduleViewTests" MinAppointmentWidth="100" Tag="{Binding Path=Context, ElementName=TestDayPage}" telerik:StyleManager.Theme="Metro" Grid.Column="1" EditAppointmentDialogStyle="{StaticResource EditAppointmentDialogStyle1}" AppointmentCreating="RadScheduleViewTests_AppointmentCreating_1" AppointmentEditing="RadScheduleViewTests_AppointmentEditing_1" AppointmentDeleting="RadScheduleViewTests_AppointmentDeleting_1" FirstDayOfWeek="Sunday" ShowDialog="RadScheduleViewTests_ShowDialog_1" AppointmentEdited="RadScheduleViewTests_AppointmentEdited_1"> <telerik:RadScheduleView.DragDropBehavior> <examiners:CustomDragDropBehaviour/> </telerik:RadScheduleView.DragDropBehavior> <telerik:RadScheduleView.SchedulerDialogHostFactory> <test:CustomScheduleViewDialogHostFactory /> </telerik:RadScheduleView.SchedulerDialogHostFactory> <telerik:RadScheduleView.ViewDefinitions> <telerik:DayViewDefinition/> <telerik:WeekViewDefinition/> <telerik:MonthViewDefinition/> <telerik:TimelineViewDefinition/> </telerik:RadScheduleView.ViewDefinitions> </telerik:RadScheduleView> </Grid>

Y aquí está mi propiedad. A pesar del enlace bidireccional, siempre es nulo:

Salesmen.xaml.cs:

string totalSalesmen { get; set; }

He oído hablar de VisualTreeHelper y LogicalTreeHelper . Esto podría permitir otro enfoque: encontrar el control y obtenerlos manualmente. Sin embargo, VisualTreeHelper solo ve LayoutRoot y sus hijos (no UserControl.Resources), y LogicalTreeHelper no parece estar disponible (es un proyecto SilverLight 5; no sé qué framework usa Silverlight 5. Entiendo que LogicalTreeHelper es solo disponible en 4.5 y posteriores)

Gracias por su ayuda. Nota: esta pregunta recibirá una recompensa de +50 . El sistema requiere que espere 2 días para poner una recompensa, entonces pondré la recompensa y acepto la respuesta después de 2 días. Te dejaré saber si tu respuesta funciona antes de eso.


Si agrega TotalSalesmen al DataContext de la plantilla, por ejemplo

public class SpecialAppointment: Appointment { private int _totalSalesmen = 0; public int TotalSalesmen {get {return _totalSalesmen; } {set {_totalSalesmen = value; OnPropertyChanged(()=> this.TotalSalesmen);} }

Debería poder enlazar el cuadro de texto así:

<TextBox Text="{Binding TotalSalesmen, Mode=TwoWay}" />

Tenga en cuenta que el enlace TotalSalesmen entre TotalSalesmen y minúsculas y debe coincidir con el nombre de propiedad TotalSalesmen y no con el campo _totalSalesmen .


Su Binding a totalSalesmen y todo dentro de EditAppointmentTemplate1 no tendrá ningún efecto, siempre y cuando la Template nunca se crea una instancia. Piense en una Template (tanto ControlTemplate como DataTemplate) como un modelo. Los elementos que se definen en el interior solo se instancian cuando la plantilla se usa en algún lugar.

¿Tienes un uso en alguna parte? Me gusta esto:

<Grid> ... <SchedulerDialog Template="{StaticResource EditAppointmentTemplate1}"/> ... </Grid>

[Editar # 1]

Ok, veamos ... tu Binding días con los vendedores totales se ve bien, aunque un poco apestosa. Creo que la propiedad total de los vendedores debería vivir en el DataContext (y sería más fácil vincularse). Pero primero intentemos hacer que su código funcione, tal vez lo hagamos bien más tarde:

El problema

Cuándo (en un solo archivo xaml) usar ElementName en Bindings mientras que al mismo tiempo usa plantillas para definir partes de la UI (y recuerde: las cosas en las plantillas solo se crean cuando se usan en alguna parte, y la creación puede ocurrir en otro punto en el tiempo) existe el riesgo de que los elementos que espera conocerse de hecho se creen en diferentes NameScopes . Y tus Enlaces de Elemento-Nombre afectados no funcionarán. Simplemente silenciosamente no funcionará.

Una cura

Puede probar un truco: asegúrese de tener un StaticResource que contenga la referencia al elemento que originalmente quería usar por ElementName . Y luego solo escribes un Binding contra ese StaticResource . Mira lo que he hecho aquí:

<UserControl x:Class="Salesmen" ... x:Name="me"> <UserControl.Resources> <BindableObjectReference x:Key="MyUserControl" Object="{Binding ElementName=me}"/> <ControlTemplate x:Key="EditAppointmentTemplate1" TargetType="local:SchedulerDialog"> ... <TextBox Text="{Binding Path=Object.totalSalesmen, Source={StaticResource MyUserControl}, Mode=TwoWay}"/> ... </ControlTemplate> </UserControl.Resources>

y el código

public class BindableObjectReference : DependencyObject { public object Object { get { return GetValue( ObjectProperty ); } set { SetValue( ObjectProperty, value ); } } public static readonly DependencyProperty ObjectProperty = DependencyProperty.Register( "Object", typeof( object ), typeof( BindableObjectReference ), new PropertyMetadata( null ) ); }

[Editar # 2]

Cuando se vincula a una propiedad del DataContext, solo especifica la ruta pero no el origen (implícitamente el origen será el DataContext):

Text="{Binding Path=totalSalesmen, Mode=TwoWay}"