Решение в посте блога не будет работать с элементом управления DataGrid
, поскольку класс DataGridTemplateColumn
не относится к дереву визуалов, и даже когда я пытался связать его со статическим классом, я не делалпреуспеть из-за странных исключений после изменения свойств.
В любом случае есть два возможных способа решения этой проблемы.
1) Более простой способ.
Использование класса ObservableCollection
.
var itemIndex = 0;
var currentItem = vm.Items[itemIndex];
//Change necessary properties
//..
vm.Items.Remove(currentItem);
vm.Items.Insert(itemIndex, currentItem);
2) Более сложный способ.
Вы можете добавить в свой класс элементов свойство, которое возвращает сам объект.
public ItemViewModel(/*...*/)
{
this.SelfProperty = this;
//...
}
public ItemViewModel SelfProperty { get; private set; }
public void Update()
{
this.SelfProperty = null;
this.OnPropertyChanged("SelfProperty");
this.SelfProperty = this;
this.OnPropertyChanged("SelfProperty");
}
После этого вы можете использовать ContentControl.ContentTemplateSelector
вместо CellTemplateSelector
следующим образом:
<DataGridTemplateColumn Header="Color Range">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding SelfProperty}" ContentTemplateSelector="{StaticResource mySelector}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
А когда вы изменяете свойство, как-то вызывайте метод Update
:
currentItem.SomeDataProperty = "some new value";
//Or you can add this method call to the OnPropertyChanged
//so that it calls authomatically
currentItem.Update();
Причина, по которой я сначала установил нулевое значение для SelfProperty
в методе Update
, заключается в том, что Selector
не будет обновлять шаблон до тех пор, пока свойство Content
полностью изменился.Если я снова установлю тот же объект - ничего не произойдет, но если я сначала установлю для него нулевое значение - изменения будут обработаны.