0

JobItem クラスの「AdminTime」という double プロパティにバインドするテキストブロックがあります。AdminTime は、TimeLog という observablecollection にある管理時間の合計を計算します。テキストボックスを使用して、これらの管理時間を JobItem クラスに追加します。縮小されたコードは次のとおりです。

<TextBlock Style="{StaticResource TextBlockStyle}" Grid.Row="1" Grid.Column="1" Name="adminHrs" Text="{Binding Path=AdminTime, UpdateSourceTrigger=Explicit, Mode=OneWay, StringFormat={}{0:0.00}}" />
<TextBox Style="{StaticResource textBoundStyle}" Name="adminTimeTxtBox" Grid.Row="3" Grid.Column="1"  />
<Button Style="{StaticResource addTimeStyle}" Name="addAdBtn" Grid.Column="1" Grid.Row="3" Click="addAdBtn_Click" />
<Button Style="{StaticResource subTimeStyle}" Name="subAdBtn" Grid.Column="1" Grid.Row="3" Click="subAdBtn_Click" />

コード ビハインドには、addTime ボタン クリック ハンドラがあります。私の UpdateSourceTrigger は既に明示的であり、ソースを更新すべきではないことを理解していることに注意してください。ただし、それが私の問題に役立つかどうかを確認しただけです。

public static readonly DependencyProperty AdminTimeProperty =
        DependencyProperty.Register("AdminTime", typeof(double),
        typeof(UpdateJobDialog));
private void addAdBtn_Click(object sender, RoutedEventArgs e)
    {
        AddHours();
    }

    private void AddHours()
    {
        item.AddTime(emp.UserType, emp.UserId, DateTime.Now, double.Parse(adminTimeTxtBox.Text));
        BindingExpression adHr = adminHrs.GetBindingExpression(TextBlock.TextProperty);
        adHr.UpdateSource();
    }

私の JobItem クラスには、次のコードがあります。

public double AdminTime
    {
        get
        {
            double newTime = 0.00;
            if (TimeLog != null)
            {
                foreach (HoursWorked hw in TimeLog)
                {
                    if (hw.EmployeeType == "Admin")
                        newTime += hw.Hours;
                }
            }
            adminTime = newTime;
            return adminTime;
        }

        set 
        {
            if (AdminTime != value)
            {
                adminTime = value;
                OnPropertyChanged("AdminTime");
            }
        }
    }

public void AddTime(string employeeType, string userId, DateTime datePosted, double hours)
    {
        HoursWorked newLog;
        newLog = new HoursWorked(employeeType, userId, datePosted, hours);
        TimeLog.Add(newLog);

    }

public ObservableCollection<HoursWorked> TimeLog
    {
        get { return timeLog; }
        set
        {
            if (!TimeLog.Equals(value))
            {
                timeLog = value;
                OnPropertyChanged("TimeLog");
            }
        }

    }

ウィンドウを終了して再度開くと、テキストブロックがバインドされます。addAdBtnをクリックすると、テキストブロックが更新されます。管理時間のテキストブロックとボタンを表示するためにダイアログを開いて時間を追加し、ダイアログを閉じて、更新されたテキストブロックを表示するためにもう一度開く必要はありません。

4

1 に答える 1

0

私は実際にそれを理解しました、私はちょうど私のupdatesourcetriggerを双方向に変更する必要がありました。

于 2012-06-08T22:19:52.943 に答える