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:
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
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 ;
()
C'est juste une liste record, rien de spécial ... – akaphenom
C'était un changement assez facile - merci. – akaphenom
implémente l'inotify partout ... – akaphenom