2010-08-26 14 views
0

En utilisant une vue de grille, j'ai une colonne avec un contrôle NumericUpDown lié à une liste sous-jacente d'objets. Le problème est que je peux lier à l'événement valuechanged sur le contrôle UpDown, cependant quand je mets à jour les pourcentages, il ne se met pas à jour sur l'écran (GridView). Si dans member.refreshCandidatesGrid j'appelle grid.Rebind() il provoque un désordre (l'écran se bloque). Si j'ajoute un bouton sur le côté et que je clique dessus après avoir défini toutes les valeurs et avoir cet appel member.refreshCandidatesGrid avec le rebind everythgin fonctionne bien.GridView: colonne NumericUpDown pour mettre à jour une deuxième colonne

J'aimerais avoir 1 sur 2 approches de travail:

  1. pousser la fileuse (décompteur numérique), et ont le feu d'un événement (par tick dans la fileuse) que je peux utiliser pour mettre à jour le pourcentages

  2. ont un feu d'événement lorsque je quitte ce champ de fileur, malheureusement le LostFocus semble être le seul événement qui peut donner un sens et semble tirer au cours de la poursuivre en justice la spinner ...

Réflexions sur l'approche, la structure du code (même si elle n'est pas liée) sont tous appréciés - merci d'avance.

Le XAML ressemble somesthing comme ceci:

<telerik:RadGridView x:Name="candidateGrid" DataContext="{Binding}"> 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn Header="Score" IsFilterable="False" 
         DataMemberBinding="{Binding score, Mode=TwoWay}" Width="80" > 
        <telerik:GridViewDataColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding score}" HorizontalAlignment="Right"/> 
         </DataTemplate> 
        </telerik:GridViewDataColumn.CellTemplate> 
        <telerik:GridViewDataColumn.CellEditTemplate> 
         <DataTemplate> 
          <telerik:RadNumericUpDown Loaded="Editor_Loaded" Maximum="10000" UpdateValueEvent="PropertyChanged" IsInteger="True" Minimum="0" ValueChanged="score_ValueChanged" 
            Value="{Binding score, Mode=TwoWay, UpdateSourceTrigger=Explicit}" Width="60" O /> 
         </DataTemplate> 
        </telerik:GridViewDataColumn.CellEditTemplate> 
       </telerik:GridViewDataColumn> 
       <telerik:GridViewDataColumn Header="Percent" IsReadOnly="True" IsFilterable="False" Width="70"> 
        <telerik:GridViewDataColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding percent}" HorizontalAlignment="Right"/> 
         </DataTemplate> 
        </telerik:GridViewDataColumn.CellTemplate> 
       </telerik:GridViewDataColumn> 

et il est lié à une classe f # comme ce qui suit:

namespace BV 

open System 
open System.Text.RegularExpressions 
open System.Windows ; 
open System.Windows.Controls; 
open System.Windows.Controls.Primitives ; 
open System.Windows.Media ; 
open Telerik.Windows.Controls; 

open Globals 
open RpcBV 

type Page() as this =  
    inherit UriUserControl("/BV;component/page.xaml", "page") 

    // instance data 
    let mutable brokers = RpcBV.getCandidates() 

    // bound controls for add candidate 
    let FE : FrameworkElement = (this.Content :?> FrameworkElement) 
    let candidateGrid : RadGridView = FE ? candidateGrid 

    do 
     firm.ItemsSource <- RpcBV.getFirms() 
     email.Background <- SolidColorBrush(Colors.Red) 
     addBtn.IsEnabled <- false 
     this.refreshCandidatesGrid() ; 

    member this.refreshCandidatesGrid() = 
     candidateGrid.ItemsSource <- brokers ; 
     () 



    member this.calculatePercentages() = 
     let totalScore = List.fold (fun acc (candidate: ScorableCandidate) -> acc + candidate.score) 0 brokers 

     let scoreEm (candidate: ScorableCandidate) = 
      candidate.percent <- (float candidate.score)/float totalScore * 100. 

     List.iter scoreEm <| brokers 

    member this.addCadidate_Click (sender : obj) (args : RoutedEventArgs) = 
     this.addCandidateFromForm() 
     this.resetAddCandidateForm() 
     this.refreshCandidatesGrid() 

    member this.score_LostFocus (sender : obj) (args : RoutedEventArgs) = 
     () 

    member this.score_ValueChanged (o : obj) (arg : RadRangeBaseValueChangedEventArgs) = 
     this.calculatePercentages() 

    member this.Editor_Loaded (sender:obj) (args: RoutedEventArgs) = 
     let ctrl = sender :?> Control; 
     ctrl.Focus() |> ignore ; 
     () 

Répondre

1

Si vous souhaitez que les modifications de propriété soient reflétées immédiatement dans l'interface utilisateur puis le type auquel vos contrôles sont liés devrait probablement implémenter l'interface INotifyPropertyChanged (ou utiliser un autre mécanisme tel qu'exposer DependencyProperties). À quoi ressemble votre définition de ScorableCandidate?

+0

C'est juste une liste record, rien de spécial ... – akaphenom

+0

C'était un changement assez facile - merci. – akaphenom

+0

implémente l'inotify partout ... – akaphenom