用于安全DataBinding的WPF DataTemplate

时间:2015-02-24 16:17:43

标签: c# wpf

有人可以提供此答案的简短示例代码:One way to get feedback if your bindings are broken, is to create a DataTemplate and declare its DataType to be the type of the ViewModel that it binds to

如何重构例如:

<UserControl x:Class="Application.Views.TestView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vm="clr-namespace:Application.ViewModels"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">        
        <Grid>    
            <StackPanel HorizontalAlignment="Left" Height="34" VerticalAlignment="Top">
                <Button Content="Press me!" Command="{Binding Path=ServiceReadCommand}" />
                <ListBox Width="200" Height="200" DataContext="{Binding ReactiveList}" />
            </StackPanel>
        </Grid>        
</UserControl>

然后在ReactiveUi中使用Control作为:

// Navigate to the opening page of the application
Router.Navigate.Execute(new TestViewModel(this));

在AppBootStrapper中。

1 个答案:

答案 0 :(得分:0)

这个答案所指的是一个叫做隐式DataTemplate 的人。这是一个包含数据类型的DataTemplate,但没有用于标识它的关键属性。

每当WPF在Visual Tree中绘制非UI对象时,它会检查是否首先为该对象定义了任何模板。

例如,如果您在<XXXX.Resources>某处

中有以下内容
<DataTemplate DataType="{x:Type local:TestViewModel}">
    <local:TestView />
</DataTemplate>

然后,当WPF尝试在UI中绘制TestViewModel对象时,它会使用TestView绘制它。

ContentControl经常用于在UI中插入代码对象,因为.Content属性可以是任何对象,包括ViewModel或Models。

<ContentControl Content="{Binding CurrentViewModel}" />

您链接的问题是关于如何使绑定本身类型安全并支持重构,这不会那样做。例如,如果您有<TextBox Text="{Binding Name}" />并且想要将Name重命名为GroupName,则Visual Studio不会知道.Name属性已链接到重命名的.GroupName } property。