2016-07-05 2 views
2

У меня есть привязка к родительскому элементу. Как я могу предоставить тип данных для DataContext в привязке, поэтому intellisense может разрешить связанные свойства?Связывание работает отлично, но intellisense говорит: Не удается разрешить свойство XXX в контексте данных типа 'object'

Связывание прекрасно работает во время выполнения. Итак, у меня есть следующий XAML структура:

<TabControl Name="TabDynamic" 
      ItemsSource="{Binding TabItems, Mode=OneWay}" ...> 
    <TabControl.Resources> 
     <DataTemplate x:Key="TabHeader" DataType="TabItem"> 
      <DockPanel> 
       <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Header}" /> 
       <Button Command="{Binding ElementName=TabDynamic, Path=DataContext.DeleteTabCommand}" 
         CommandParameter="{Binding ElementName=TabDynamic, Path=DataContext.TabItems/}"> 
        <Image Source="{DynamicResource DeleteImg}" Height="11" Width="11"></Image> 
       </Button> 
      </DockPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="TabContent" DataType="viewModels:ConnectionInfoVM"> 
      <views:BufferViewerControl/> 
     </DataTemplate> 
    </TabControl.Resources> 
</TabControl> 

типа данных из DataContext является "ViewModels: ConnectionInfoVM". Intellisense теперь будет подчеркивать оба свойства в DataContext (так подчеркнуты DeleteTabCommand и TabItems).

я уже пытался использовать время разработки определения данных контекста «D:» DataContext в Button элемента следующим образом:

d:DataContext="{d:DesignInstance viewModels:ConnectionInfosVM}" 

Но это не меняет предупреждения IntelliSense.

Я также попытался определить DataType на DataTemplate как «viewModels: ConnectionInfosVM», как и для шаблона контента, но это тоже не изменяет предупреждения intellisense (и, я думаю, это было бы неправильно, поскольку тип данных элемента действительно является TabItem).

Другая попытка была определить DataContext, добавив следующее определение Button элемента:

<Button.DataContext> 
    <viewModels:ConnectionInfosVM/> 
</Button.DataContext> 

Но это тоже не избавиться от предупреждений.

+0

Создает ли VM данные во время разработки для элементов, к которым нужно привязать? – OmegaMan

+0

Нет, во время разработки еще нет данных TabControl.It будет заселен позже на основе сетевой связи. – ptair

+0

Если вы удалите содержимое кнопки, произойдет ли сбой intellisense? Неясно, где происходит ошибка ... если вы можете сузить ее до любой команды или содержимого, которое может быть сказано. Также, какую версию визуальной студии вы используете? Вы пробовали последнюю версию Blend, делает то же самое? – OmegaMan

ответ

1

Я нашел решение, по крайней мере, для описанной выше проблемы. Я устанавливал DataContext соответствующего окна в коде. В моем примере TabControl просто наследует DataContext, который является ConnectionInfosVM.

Для того, чтобы исправить эти предупреждения (и, конечно, накопленной гибкость в обеспечении DataContext локатором), я определил DataContext в XAML следующим образом:

<UserControl ... 
      DataContext="{Binding Source={StaticResource mainViewModelLocator}, Path=ConnectionInfosVM}"> 

Кажется, что IntelliSense теперь в состоянии для устранения этих ссылок. Но с другой стороны, я также изменил TextBlock содержащуюся в DataTemplate к следующему:

<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=DataContext.Address}" /> 

теперь DataContext такой TabItem на самом деле другой тип, как тип объекта подложки для TabItem. Таким образом, в этом случае адрес Property не найден intellisense.

Итак, вопрос типа останков, есть ли возможность определить тип DataContext в рамках привязки, определенной в DataTemplate?