To reproduce: use the following code snippet and try to drag an item or click over a task item:
private ViewModel viewModel;
public Form1()
{
InitializeComponent();
viewModel = new ViewModel();
viewModel.Init();
viewModel.DateChanged += ViewModelOnDateChanged;
this.radGanttView1.Ratio = 0.3F;
this.radGanttView1.SplitterWidth = 7;
this.radGanttView1.TitleMember = "Name";
this.radGanttView1.ChildMember = "Id";
this.radGanttView1.EndMember = "End";
this.radGanttView1.ParentMember = "ParentId";
this.radGanttView1.ProgressMember = "Progress";
this.radGanttView1.StartMember = "Start";
this.radGanttView1.TaskDataMember = "TimingRows";
this.radGanttView1.LinkDataMember = "LinkRows";
this.radGanttView1.LinkStartMember = "StartId";
this.radGanttView1.LinkEndMember = "EndId";
this.radGanttView1.LinkTypeMember = "LinkType";
this.radGanttView1.DataSource = viewModel;
this.radGanttView1.Click += radGanttView1_Click;
}
private void radGanttView1_Click(object sender, EventArgs e)
{
this.radGanttView1.DataSource = null;
this.radGanttView1.DataSource = viewModel;
}
private void radGanttView1_MouseEnter(object sender, EventArgs e)
{
this.radGanttView1.DataSource = null;
this.radGanttView1.DataSource = viewModel;
}
private void ViewModelOnDateChanged(object sender, EventArgs eventArgs)
{
BeginInvoke(new Action(() =>
{
this.radGanttView1.DataSource = null;
this.radGanttView1.DataSource = viewModel;
}));
}
public class ViewModel
{
public event EventHandler DateChanged;
public BindingList<TimingRow> TimingRows { get; set; }
public BindingList<LinkRow> LinkRows { get; set; }
public ViewModel()
{
TimingRows = new BindingList<TimingRow>();
LinkRows = new BindingList<LinkRow>();
}
public void Init()
{
AddRow(1, 0, "group", 3, 12);
AddRow(2, 1, "Test1", 3, 4);
AddRow(3, 1, "Test2", 7, 8);
AddLink(2, 3, 1);
}
private void AddLink(int p1, int p2, int p3)
{
var link = new LinkRow(p1, p2, p3);
LinkRows.Add(link);
}
private void AddRow(int id, int parentId, string name, int addDays, int howLong)
{
var row = new TimingRow
{
Start = DateTime.Today.AddDays(addDays),
End = DateTime.Today.AddDays(addDays + howLong),
Id = id,
ParentId = parentId,
Name = name
};
row.DateChanged += RowOnDateChanged;
TimingRows.Add(row);
}
private void RowOnDateChanged(object sender, EventArgs eventArgs)
{
if (DateChanged != null)
DateChanged(this, EventArgs.Empty);
}
}
public class TimingRow
{
public event EventHandler DateChanged;
private DateTime start;
public string Name { get; set; }
public int Id { get; set; }
public int ParentId { get; set; }
public decimal Progress
{
get
{
return 0;
}
}
public virtual DateTime Start
{
get
{
return start;
}
set
{
if (start == value)
return;
if (DateChanged != null)
DateChanged(this, EventArgs.Empty);
start = value;
}
}
public virtual DateTime End { get; set; }
}
public class LinkRow
{
public int StartId { get; set; }
public int EndId { get; set; }
public int LinkType { get; set; }
public LinkRow(int startId, int endId, int linkType)
{
this.StartId = startId;
this.EndId = endId;
this.LinkType = linkType;
}
}
---------------------------------------------------------------------------------
WORKAROUND:
private void radGanttView1_CreateDataItem(object sender, Telerik.WinControls.UI.CreateGanttDataItemEventArgs e)
{
e.Item = new CustomGanttViewDataItem();
}
public class CustomGanttViewDataItem : GanttViewDataItem
{
protected override void OnNotifyPropertyChanged(PropertyChangedEventArgs e)
{
if (this.GanttViewElement != null)
{
base.OnNotifyPropertyChanged(e);
}
}
}
public class CustomGanttView : RadGanttView
{
public override string ThemeClassName
{
get
{
return typeof(RadGanttView).FullName;
}
}
protected override RadGanttViewElement CreateGanttViewElement()
{
return new CustomRadGanttViewElement();
}
}
public class CustomRadGanttViewElement : RadGanttViewElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(RadGanttViewElement);
}
}
protected override GanttViewGraphicalViewElement CreateGraphicalViewElement(RadGanttViewElement ganttView)
{
return new CustomGanttViewGraphicalViewElement(ganttView);
}
}
public class CustomGanttViewGraphicalViewElement : GanttViewGraphicalViewElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(GanttViewGraphicalViewElement);
}
}
public CustomGanttViewGraphicalViewElement(RadGanttViewElement ganttView) : base(ganttView)
{
}
protected override IVirtualizedElementProvider<GanttViewDataItem> CreateElementProvider()
{
return new CustomGanttViewVirtualizedElementProvider(this);
}
}
public class CustomGanttViewVirtualizedElementProvider : GanttViewVirtualizedElementProvider
{
GanttViewBaseViewElement owner;
public CustomGanttViewVirtualizedElementProvider(GanttViewBaseViewElement owner) : base(owner)
{
this.owner = owner;
}
public override IVirtualizedElement<GanttViewDataItem> CreateElement(GanttViewDataItem data, object context)
{
GanttViewBaseItemElement element = this.OnItemElementCreating(data);
if (element != null)
{
return element;
}
if (owner is GanttViewTextViewElement)
{
return new GanttViewTextItemElement(owner as GanttViewTextViewElement);
}
else
{
if (data.Items.Count > 0)
{
return new GanttViewSummaryItemElement(this.owner as GanttViewGraphicalViewElement);
}
else if (data.Start == data.End)
{
return new GanttViewMilestoneItemElement(this.owner as GanttViewGraphicalViewElement);
}
return new CustomGanttViewTaskItemElement(this.owner as GanttViewGraphicalViewElement);
}
}
}
public class CustomGanttViewTaskItemElement : GanttViewTaskItemElement
{
public CustomGanttViewTaskItemElement(GanttViewGraphicalViewElement owner) : base(owner)
{
}
public override void Synchronize()
{
if (this.Data.GanttViewElement != null)
{
base.Synchronize();
}
}
}