对单个控件使用类型化的数据模板

本文关键字:数据 类型化 单个 控件 | 更新日期: 2023-09-27 17:57:50

有没有办法将Border的某些属性分配给ViewModel,然后让Border的内容与该ViewModel对应的任何类型的数据模板相匹配?

这是一个非常做作的例子,但假设我有一个用户控制:

<Grid>
    <StackPanel>
        <TextBox Height="30" Width="300" Margin="10" Text="{Binding IntProperty}"></TextBox>
        <TextBox Height="30" Width="300" Margin="10"></TextBox>
        <Border x:Name="SingleElement" Height="100" Width="350" BorderBrush="Red" />
    </StackPanel>
</Grid>

我有一个键入的数据模板:

<DataTemplate DataType="local:SingleItemViewModel1">
    <StackPanel>
        <TextBlock Margin="10" Text="{Binding A}"></TextBlock>
        <TextBlock Margin="10" Text="{Binding B}"></TextBlock>
    </StackPanel>
</DataTemplate>

在我的用户控件的代码后面(同样是人为的),是否有SingleElement的属性可以分配给SingleItemViewModel1的新实例,以便上面的DataTemplate将显示在其中?

对单个控件使用类型化的数据模板

假设您绑定到一个视图模型,该模型公开了类型为SingleItem:的名为"Item"的属性

定义数据模板后,这应该可以工作:

<Grid>
    <StackPanel>
        <TextBox Height="30" Width="300" Margin="10" Text="{Binding IntProperty}"></TextBox>
        <TextBox Height="30" Width="300" Margin="10"></TextBox>
        <Border x:Name="SingleElement" Height="100" Width="350" BorderBrush="Red">
            <ContentControl Content="{Binding Item}"/>
        </Border>
    </StackPanel>
</Grid>

请注意,Border是FrameworkElement和Decorator的后代——它没有自己的"内容",只有一个视觉子级。因此,ContentControl被声明为其子级。