0

私はこれを持っていますDataGrid

<DataGrid x:Name="dgTimeline" Focusable="False" GotFocus="dgTimeline_GotFocus">

そこで、カスタム クラスを使用して列を追加し、そのプロパティを次のようTimelineControlにバインドします。MinutesTime%

for (int i = 0; i <= 30; i++)
{
    FrameworkElementFactory fef = new FrameworkElementFactory(typeof(TimelineControl));
    Binding bTemp = new Binding("Time" + i);
    bTemp.Mode = BindingMode.TwoWay;
    fef.SetValue(TimelineControl.MinutesProperty, bTemp);
    DataTemplate dt = new DataTemplate();
    dt.VisualTree = fef;
    dgTempCol.CellTemplate = dt;

    dgTimeline.Columns.Add(dgTempCol);
}

ここにあるTimelineControl

public static DependencyProperty MinutesProperty =
DependencyProperty.Register("Minutes", typeof(string), typeof(TimelineControl),
new PropertyMetadata(OnMinutesChanged));

public string Minutes
{
    get { return (string)GetValue(MinutesProperty); }
    set { SetValue(MinutesProperty, value); }
}

private static void OnMinutesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Console.WriteLine("foo bar");
}

後で、次の行をいくつか追加します。

TimeScale temp;
temp = this.addEvent(temp, 23);
temp = this.addEvent(temp, 24);
temp = this.addEvent(temp, 25);
temp = this.addEvent(temp, 26);

dgTimeline.Items.Add(temp);

private TimeScale addEvent(TimeScale temp, int time)
{
    PropertyInfo propertyInfo = temp.GetType().GetProperty("Time" + (time / 60));

    if (propertyInfo.GetValue(temp, null) != null)
    {
        if (propertyInfo.GetValue(temp, null).ToString().IndexOf((time % 60).ToString()) == -1)
        {
            propertyInfo.SetValue(temp, Convert.ChangeType(propertyInfo.GetValue(temp, null) +
                "," + (time % 60), propertyInfo.PropertyType), null);
        }
    }
    else
    {
        propertyInfo.SetValue(temp, Convert.ChangeType(time % 60, propertyInfo.PropertyType), null);
    }

    return temp;
}

これまでのところすべて正常に動作しており、OnMinutesChanged正常にトリガーされ、UI が更新されています。問題は、上にあるものを更新しようとするDataGridOnMinutesChanged、トリガーされず、UI が更新されないことです。

私の目的OnMinutesChangedは、変更された特定の要素の UI を手動で更新することです。を呼び出すとdgTimeline.Items.Refresh()、グリッド全体が更新され、すべてが機能し、OnMinutesChangedが呼び出されます。問題は、このグリッドが毎秒更新されるdgTimeline.Items.Refresh()ため、要素の数が多いため (簡単に 500 以上)、呼び出しによってアプリケーションがほとんどフリーズすることです。1 秒あたり 3 つの要素の UI を更新する必要があるだけで、500 要素すべてを更新する必要はありません。そのため、手動で更新する必要があります。

私は正しいことをしていますか?はいの場合OnMinutesChanged、グリッドを更新するときに呼び出されないのはなぜですか?

4

1 に答える 1

2

DataGridバインディング グループを使用して行全体を検証し、プロパティの 1 つに無効な値が割り当てられた場合に基になるオブジェクトが無効な状態になるのを防ぎます。UpdateSourceTriggerこれにより、セル内のバインディングのデフォルトが に変更されます。バインディング オブジェクトでExplicit明示的に に設定することで、これをオーバーライドできます。PropertyChanged

通常、ユーザーが行の編集を終了すると、更新が呼び出されますが、使用するため編集モードに入ることはCellTemplateありませんCellEditingTemplate

于 2013-05-27T15:49:41.243 に答える