2009-12-01 4 views
2

В моем приложении SilverLight у меня есть свойство в моей модели ViewModel с именем 'vmProperty' и список под названием 'dgSource'.SilverLight - свойство viewmodel привязки MVVM к столбцу datagrid

Я привязываю свой dgSource к datagrid как ItemsSource, после чего каждый файл datacontext строки datagrid изменяется на каждый элемент dgSource. Один из столбцов, например столбец флажка, должен привязываться к vmProperty. Но поскольку ViewModel больше не является сигнатурным текстом строки, я не могу получить доступ к этому свойству.

Как решить эту проблему? Если вопрос непонятен, сообщите мне, и я отправлю образец. Заранее спасибо.

+0

Действительно ли каждый экземпляр флажка для каждой строки привязывается к одному и тому же свойству родительского объекта, кажется, не имеет для меня большого смысла? – AnthonyWJones

ответ

0

Предположим, что ваш ViewModel назначается в качестве DataContext в LayoutRoot в это должно работать: -

IsChecked="{Binding DataContext.vmProperty, ElementName=LayoutRoot}" 

Конечно, это не работает, в конечном счете шаблон репликации и, следовательно, «LayoutRoot» не существует в namescope, где привязка фактически используется.

Простейшим решением, так как это ViewModel, является изменение модели. Выделите требуемое значение для объектов, доступных в dgSource, или опубликуйте свойство Parent, которое переместится обратно в ViewModel.

+0

Спасибо за ваши ответы. Я использовал метод ElementName, о котором вы упоминали. Но я столкнулся с тем же вопросом, что и в «http://stackoverflow.com/questions/1089650/silverlight-datagrid-celltemplate-binding-to-viewmodel». Я помещаю это за пределы datagrid, и этот кусочек кода отлично работает. Но внутри datagrid это не делает. В любом случае, я использовал ссылку, содержащуюся в этой теме 'http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx ', но это кажется актуальным только для WPF. Я не могу получить доступ к AddOwner или OverrideMetadata. Мысли? – etrast81

+0

Thanks Anthony, Удалено, чтобы разоблачить его как часть dgSource. Не нравится, так как это репликация. Но он работает. Итак ... :) – etrast81

+0

То есть преимущество модели __view__.Было бы очень неудовлетворительно, если бы это был просто __model__, но весь смысл модели представления заключается в том, что его искаженная форма данных поддерживает определенный вид или задачу. – AnthonyWJones

0

Попробуйте установить проверили свойство вашей колонки chechbox в том, что:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourViewClassName}}, Path=DataContext.vmProperty} 

Это означает, что родительский элемент, какой тип будет найден ваш тип вид и чем vmProperty из его DataContext будет извлечено в качестве значения.

UPDATE:

Это решение для WPF.

Для Silverlight Я думаю, вы можете попробовать использовать конструкцию, как это:

{Binding Path=DataContext.vmProperty, ElementName=YourElement} 

Где DataContext из YourElement является экземпляром вашей модели представления. Я думаю, что это может быть сетка, например.

<Grid x:Name="YourElement" DataContext={Binding}> 
<!-- DataGrid here --> 
</Grid> 
+0

Я думаю, что это WPF, не так ли? Я полагаю, у SilverLight нет RelativeSource или AncestorType. – etrast81

+0

У этого есть RelativeSource, но только в очень ограниченной емкости – AnthonyWJones

+0

Извините, это WPF. – bniwredyc