【问题标题】:Wpf Bind View to ViewModel add to wpf windowWpf 将视图绑定到 ViewModel 添加到 wpf 窗口
【发布时间】:2010-07-15 20:48:50
【问题描述】:

我有一个包含 ItemsControl 的视图,其中包含一些文本块以显示名称和其他信息。在我的窗口中,我将视图添加到窗口,如下所示,在窗口后面的代码中,我将视图的数据上下文绑定到 MainWindow Loaded 事件中的视图模型,如下所示 ViewOwnerSideBar.DataContext = viewModel 应用程序编译但当我运行它我没有得到数据?我检查了我的视图模型,我的集合中确实有我要返回的数据。有没有人有任何关于如何做到这一点的好例子。我将在右侧有一个侧边栏视图和一个主视图,显示所有者的详细信息。

这是我的观点

<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>

【问题讨论】:

    标签: wpf xaml mvvm binding


    【解决方案1】:

    首先,确保您绑定的 AllOwners 集合是 ObservableCollection。

    另外,在执行时检查 Visual Studio 中的输出窗口,寻找第一次机会异常被捕获。这将是您的绑定问题所在的线索。

    我喜欢在绑定到 ItemsControl 上 Items.Count 属性的 View 上放置一个文本块,以便您可以查看它是否正在绑定并且没有呈现任何内容或没有正确绑定。

    给 ItemsControl 起个名字,然后在里面放一个文本块:

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

    【讨论】:

    • 我正在返回一个 ObservableCollection。我今天会尝试一下,看看会发生什么。谢谢你的帮助!非常感谢。
    • 非常感谢您建议查看输出窗口。我确实有一个例外。它找不到 AllOwner 集合,所以我没有调查它。再次感谢您。
    【解决方案2】:

    这可能是您已经看过的内容,但您可能有一个绑定拼写错误,您是否检查了输出窗口以查看是否收到任何跟踪消息?

    我想我是盲人,但我看不到您的用户控件在第二个条目的 xaml 中的位置。

    【讨论】:

    • 这是我将视图添加到窗口的地方 我有一些事情搞砸了,因为我在 ItemsControl 上放了一个名字并得到计数并且有 0 所以我的猜测是我已将 viewModel 绑定在错误的位置或集合不正确。我必须传递凭据才能获取数据,因此我必须将其绑定在代码中而不是 xaml 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多