Bindind资源控制与内容控制WPF

时间:2015-04-24 10:08:20

标签: wpf

我刚刚开始学习WPF。但是,现在我的UI问题(仍然是空的)。这是我使用的代码;我尝试做的是在UI中显示River的属性。

<Window.Resources>
    <local:River x:Key="theRiver" Name="Colorado River" MilesLong="1450" />
    <StackPanel x:Key="stackey" DataContext="theRiver">
        <StackPanel.Resources>
            <DataTemplate x:Key="key" DataType="{x:Type local:River}" >
                <Border x:Name="bdr" BorderBrush="Blue" BorderThickness="3" CornerRadius="12" Padding="2">
                    <Grid Margin="5">
                        <TextBlock x:Name="txt" FontFamily="Bookman old style">
                            <Run Text="The"/>
                            <TextBlock Text="{Binding Name}"/>
                            <Run Text="is"/>
                            <TextBlock Text="{Binding MilesLong}" />
                            <Run Text="miles long." />
                        </TextBlock>
                    </Grid>
                </Border>
                <DataTemplate.Triggers>
                    <Trigger SourceName="bdr" Property="IsMouseOver" Value="True">
                        <Setter TargetName="bdr" Property="Background" Value="Red"/>
                        <Setter TargetName="txt" Property="Foreground" Value="Green"/>
                        <Setter TargetName="bdr" Property="CornerRadius" Value="40"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </StackPanel.Resources>
    </StackPanel>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <!--<StackPanel Grid.Column="1" Grid.Row="1" Margin="10" Background="Gold" DataContext="{StaticResource theRiver}>-->
    <ContentControl Content="{StaticResource ResourceKey=stackey}"  Grid.Column="1" Grid.Row="1" Margin="10" Background="Gold" />
</Grid>

2 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题。

<StackPanel x:Key="stackey" DataContext="theRiver">
        <StackPanel.Resources>
            <DataTemplate x:Key="key" DataType="{x:Type local:River}" >

在这里,您要为将要加载到ContentControl中的类型提供未命名的DataTemplate。这里的StackPanel包装器是不必要的,就像DataTemplate上的x:Key一样。

<ContentControl Content="{StaticResource ResourceKey=stackey}" 

这表示ContentControl内容的来源是您在资源中声明的StackPanel,而不是River的实例。

更正/工作代码如下:

<Window.Resources>
    <local:River x:Key="theRiver" Name="Colorado River" MilesLong="1450" />

    <DataTemplate DataType="{x:Type local:River}">
        <Border x:Name="bdr"
                    BorderBrush="Blue"
                    BorderThickness="3"
                    CornerRadius="12"
                    Padding="2">
            <Grid Margin="5">
                <TextBlock x:Name="txt" FontFamily="Bookman old style">
                        <Run Text="The" />
                        <TextBlock Text="{Binding Name}" />
                        <Run Text="is" />
                        <TextBlock Text="{Binding MilesLong}" />
                        <Run Text="miles long." />
                    </TextBlock>
            </Grid>
        </Border>

        <DataTemplate.Triggers>
            <Trigger SourceName="bdr" Property="IsMouseOver" Value="True">
                <Setter TargetName="bdr" Property="Background" Value="Red" />
                <Setter TargetName="txt" Property="Foreground" Value="Green" />
                <Setter TargetName="bdr" Property="CornerRadius" Value="40" />
            </Trigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <!--  <StackPanel Grid.Column="1" Grid.Row="1" Margin="10" Background="Gold" DataContext="{StaticResource theRiver}>  -->
    <ContentControl Grid.Row="1"
                    Grid.Column="1"
                    Margin="10"
                    Background="Gold"
                    Content="{Binding Source={StaticResource theRiver}}" />
</Grid>

答案 1 :(得分:0)

只需在Windows.Resources中定义DataTemplate,如下所示(删除Stackpanel):

<DataTemplate x:Key="stackey" DataType="{x:Type local:River}" >
            <Border x:Name="bdr" BorderBrush="Blue" BorderThickness="3" CornerRadius="12" Padding="2">
                <Grid Margin="5">
                    <TextBlock x:Name="txt" FontFamily="Bookman old style">
        <Run Text="The"/>
        <TextBlock Text="{Binding Name}"/>
        <Run Text="is"/>
        <TextBlock Text="{Binding MilesLong}" />
        <Run Text="miles long." />
      </TextBlock>
                </Grid>
            </Border>

            <DataTemplate.Triggers>
                <Trigger SourceName="bdr" Property="IsMouseOver" Value="True">
                    <Setter TargetName="bdr" Property="Background" Value="Red"/>
                    <Setter TargetName="txt" Property="Foreground" Value="Green"/>
                    <Setter TargetName="bdr" Property="CornerRadius" Value="40"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>

然后将ContentControl绑定为

<ContentControl Grid.Column="1" Grid.Row="1"  DataContext="{StaticResource theRiver}" Content="{StaticResource theRiver}" ContentTemplate="{StaticResource stackey}"   Margin="10" Background="Gold" />