2010-07-15 4 views
1

У меня есть представление, которое содержит элемент ItemsControl с некоторыми текстовыми блоками внутри, чтобы отображать имя и другую информацию. в моем окне я добавляю представление к окну следующим образом, а в коде позади окна я привязываю datacontext представления к модели представления в событии MainWindow Loaded следующим образом: ViewOwnerSideBar.DataContext = viewModel Приложение компилируется, но когда Я запускаю его, я не получаю данные? Я проверил свою модель просмотра, и у меня есть данные в моей коллекции, которые я возвращаю. У кого-нибудь есть хорошие примеры того, как это сделать. Я собираюсь иметь вид в боковой панели и основной вид справа, отображающий детали владельца.Wpf Bind View to ViewModel add to wpf window

Это мой взгляд

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Resources/ColorsAndBrushes.xaml"/> 
      <ResourceDictionary Source="/Resources/DefaultStyles.xaml"/> 

     </ResourceDictionary.MergedDictionaries> 

    </ResourceDictionary> 

</UserControl.Resources> 

<DockPanel > 
    <ScrollViewer VerticalScrollBarVisibility="Auto" > 
     <ItemsControl Width="250" 
         VerticalAlignment="Stretch" 
         BorderThickness="0" 
         ItemsSource="{Binding Path=AllOwners}"> 
     <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="2"> 
         <Border Margin="2 2 0 0" 
           CornerRadius="4" 
           Background="Gray" 
           Opacity=".5" /> 
         <Border BorderBrush="{StaticResource redBrush}" 
           BorderThickness="2" 
           CornerRadius="4" 
           Background="White" 
           Margin="0 0 2 2" 
           Padding="3"> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition /> 
            <RowDefinition /> 
            <RowDefinition /> 
           </Grid.RowDefinitions> 

           <TextBlock Grid.ColumnSpan="2" 
              FontWeight="Bold" 
              Text="{Binding FullName}" /> 

           <TextBlock Grid.Row="1" 
               Text=" FirstName: " /> 
           <TextBlock Grid.Row="1" 
               Grid.Column="1" 
               Text="{Binding FirstName}" /> 

           <TextBlock Grid.Row="2" 
               Text=" Email: " /> 
           <TextBlock Grid.Row="2" 
               Grid.Column="1" 
               Text="{Binding Email}" /> 
          </Grid> 
         </Border> 
         <Button Style="{StaticResource openButton}" /> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </ScrollViewer> 
</DockPanel> 

Это мое окно

<DockPanel> 

    <v:HeaderTopBar DockPanel.Dock="Top"></v:HeaderTopBar> 
     <!--<uc:SearchBar DockPanel.Dock="Top" />--> 

    <StatusBar DockPanel.Dock="Bottom"> 
     <StatusBarItem DockPanel.Dock="Right"> 
      <Slider x:Name="zoomSlider" 
        Width="125" 
        Value="1" 
        Minimum=".5" 
        Maximum="2" /> 
     </StatusBarItem> 

     <StatusBarItem DockPanel.Dock="Right"> 
      <TextBlock>Zoom:</TextBlock> 
     </StatusBarItem> 

     <StatusBarItem> 
      <TextBlock Text="{Binding StatusText}" /> 
     </StatusBarItem> 
    </StatusBar> 

    <Expander DockPanel.Dock="Left" 
       ExpandDirection="Right" 
       IsExpanded="True" 
       BorderThickness="0 1 1 1" 
       BorderBrush="Gray" 
       Margin="0 2 0 0" 
       Padding="2"> 
     <Expander.Header> 
      <TextBlock Text="Contacts" 
         FontSize="14" 
         FontWeight="Bold"> 
       <TextBlock.LayoutTransform> 
       <RotateTransform Angle="90" /> 
       </TextBlock.LayoutTransform> 
      </TextBlock> 
     </Expander.Header> 
     <v:OwnerSideBar/> 

    </Expander> 

    <TabControl x:Name="tabs" 
       Grid.Column="2" 
       Margin="5 0"> 
     <TabControl.LayoutTransform> 
      <ScaleTransform ScaleX="{Binding ElementName=zoomSlider, 
              Path=Value}" 
          ScaleY="{Binding ElementName=zoomSlider, 
              Path=Value}" /> 
     </TabControl.LayoutTransform> 
    </TabControl> 

</DockPanel> 

ответ

1

Во-первых, убедитесь, что коллекция AllOwners, к которой вы привязываетесь, представляет собой ObservableCollection.

Кроме того, проверьте окно вывода в Visual Studio во время выполнения, найдите исключения, которые были обнаружены при первой случайности. Это будет ключ к вопросу о том, где будет ваша проблема с привязкой.

Мне нравится помещать текстовый блок в представлении, связанный с свойством Items.Count в ItemsControl, чтобы вы могли видеть, является ли он обязательным, а не визуализировать что-либо или не связывать правильно.

Дайте ItemsControl имя, затем положить TextBlock в:

<TextBlock Text="{Binding ElementName=itemControl1,Path=Items.Count}/> 
+0

Я возвращаю ObservableCollection. Я попробую сегодня и посмотрю, что с ним происходит. Спасибо, что помогли! Это очень ценно. – spafa9

+0

Большое спасибо за предложение посмотреть окно вывода. У меня есть исключение. Он не может найти коллекцию AllOwner, поэтому я не смотрю на нее. Еще раз спасибо. – spafa9

0

Это может быть что-то вы уже смотрели, но вы могли бы иметь обязательную опечатку, вы проверить выходное окно, чтобы увидеть, если вы получать сообщения о трассировке?

И я думаю, что я слепой, но я не вижу, где ваш пользовательский контроль находится в xaml второй записи.

+0

Здесь я добавляю представление к окну У меня что-то перепутано, потому что я помещаю имя в ItemsControl и получаю счет, и у меня есть 0, поэтому я предполагаю, что я связал viewModel с неправильным место или коллекция неверны. Мне нужно передать учетные данные, чтобы получить данные, поэтому мне нужно связать их в коде вместо xaml. – spafa9