我有DataGrid
:
<DataGrid x:Name="dgTimeline" Focusable="False" GotFocus="dgTimeline_GotFocus">
因此,我使用名为TimelineControl
的自定义类添加列,并将其Minutes
属性与Time%
绑定:
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也会更新。问题是,当我尝试更新DataGrid
上的某些内容时,OnMinutesChanged
未触发,并且UI未更新。
我对OnMinutesChanged
的目标是手动更新已更改的特定元素的UI。如果我调用dgTimeline.Items.Refresh()
,则刷新整个网格,一切正常,调用OnMinutesChanged
。问题是此网格每秒更新一次,因此调用dgTimeline.Items.Refresh()
会使应用程序几乎冻结,因为元素数量很高(容易超过500)。我只需要每秒更新3个元素的UI,而不是全部500个,这就是我想手动执行的原因。
我做对了吗?如果是,为什么在更新网格时没有调用OnMinutesChanged
?
答案 0 :(得分:2)
DataGrid
使用binding groups验证整行,并防止其中一个属性被赋予无效值时底层对象中的无效状态。这会将单元格中绑定的默认UpdateSourceTrigger
更改为Explicit
,您可以通过在绑定对象上将其显式设置为PropertyChanged
来覆盖此值。
通常,如果用户完成对某一行的修改,则会调用更新,但是在您使用CellTemplate
而不是CellEditingTemplate
时,您永远不会进入编辑模式。