2010-12-06 4 views
5

Я использую стандартный .NET DataGrid, как это:призма/MVVM: связывание столбцов в DataGrid

<DataGrid ItemsSource="{Binding Datensaetze}" AutoGenerateColumns="False"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="my col 1" Binding="{Binding MyCol1}"/> 
    <DataGridTextColumn Header="my col 2" Binding="{Binding MyCol2}"/> 
    <DataGridTextColumn Header="my col 3" Binding="{Binding MyCol3}"/> 
</DataGrid.Columns> 
</DataGrid> 

Это работает хорошо. Теперь я хочу определить столбцы в ViewModel, и вместо установки фиксированных столбцов в xaml я хочу сгенерировать их на лету. Однако, если я попытаюсь связать столбцы с чем-нибудь, я получаю сообщение об ошибке:

DataGrid.Columns - свойство readonly и не может быть связано.

Есть ли способ динамически связывать столбцы DataGrid с чем-то в коде?

ответ

9

Да, свойство Столбцы ReadOnly, поэтому мы не можем напрямую связываться с ним. Если вы хотите связать столбцы, вы можете попытаться использовать привязанное свойство, к которому вы привязываетесь, что, в свою очередь, обновляет столбцы.

Обновление
Используя дельта изменений в случае CollectionChanged.

Затем вы можете связать свойство BindableColumns к вашему ColumnsCollection

<DataGrid AutoGenerateColumns="False" 
      local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"> 
    <!-- ... --> 
</DataGrid> 
+0

Я использую этот штраф, но я столкнулся с проблемой, когда мне нужно обновить ObservableCollection на фоне потока (Я использую диспетчер для этого). Вышеприведенный код затем падает в делегате CollectionChanged с ошибкой «Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток». Любые предложения, что я могу сделать? – 2013-01-30 15:55:46

Смежные вопросы