GridView: столбец NumericUpDown для обновления второго столбца

Используя gridview, у меня есть один столбец с элементом управления NumericUpDown, привязанным к базовому списку объектов. Проблема в том, что я могу привязать событие с измененным значением к элементу управления UpDown, однако, когда я обновляю проценты, он не обновляется на экране (GridView). Если в member.refreshCandidatesGrid я вызываю grid.Rebind(), это вызывает беспорядок (экран блокируется). Если я добавлю кнопку сбоку и нажму на нее после того, как установлю все значения и получу этот вызов member.refreshCandidatesGrid с перепривязкой, все работает нормально.

Я хотел бы, чтобы 1 из 2 подходов работал:

  1. нажмите спиннер (числовое обновление) и запустите событие (за такт на счетчике), которое я могу использовать для обновления процентов

  2. когда я покидаю это поле вращения, у меня возникает событие, к сожалению, LostFocus, похоже, является единственным событием, которое может иметь смысл, и, похоже, срабатывает во время предъявления иска спиннеру...

Мысли о подходе, структуре кода (даже если они не связаны) приветствуются - заранее спасибо.

XAML выглядит примерно так:

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

и он связан с классом F#, как показано ниже:

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 ;
        ()

1 ответ

Решение

Если вы хотите, чтобы изменения свойств немедленно отражались в пользовательском интерфейсе, то тип, к которому привязаны ваши элементы управления, вероятно, должен реализовывать INotifyPropertyChanged интерфейс (или использовать другой механизм, такой как выставление DependencyProperties). Что означает ваше определение ScorableCandidate выглядит как?

Другие вопросы по тегам