【发布时间】:2015-04-29 14:16:27
【问题描述】:
我有一个包含 5 列的 ListView:
<ListView x:Name="FieldList" ItemsSource="{Binding MonitorField}" SelectedItem="{Binding Field}" Margin="33,22,87,209" Grid.Column="1" Grid.RowSpan="2">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Field Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Width="127" Text="{Binding Id}" Height="32" FontSize="16" IsReadOnly="False" Background="Transparent" BorderThickness="0" TextWrapping="Wrap"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="140" Header="File type" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="127" ItemsSource="{Binding ResourceTypeValues}" SelectedItem="{Binding ResourceTypeToLoad}" Height="24" FontSize="16" Background="Transparent" BorderThickness="0" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="140" Header="Path" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<MyNamespace:PathControl Width="127" Text="{Binding ResourcePathToLoad, Mode=TwoWay}" Height="32" FontSize="16" Background="Transparent" TextWrapping="Wrap">
<MyNamespace:PathControl.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding BrowseFileCommand}" />
</MyNamespace:PathControl.InputBindings>
</MyNamespace:PathControl>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
这是我的继承自 PathControl 的自定义控件 PathControl et TestControl
public class PathControl : TextBox, IPathControl
{
static PathControl()
{
//DefaultStyleKeyProperty.OverrideMetadata(typeof(PathControl), new FrameworkPropertyMetadata(typeof(PathControl)));
}
}
public class TestControl : PathControl
{
static TestControl()
{
}
}
我想做的是让 WPF 实例化一个自定义控件,具体取决于我在 PathControl 之前定义的 Combobox。
例如,如果我在组合框中选择“Txt”,我想创建一个继承自 PathControl 的 TxtControl。
鼠标绑定将根据实例化的自定义控件调用不同的方法。
这甚至可能吗?还有其他方法可以实现吗?
【问题讨论】:
-
使用 MVVM,你有两个模型 -
A和B。您为它们设计了两个视图:AView : BaseView和BView : VaseView。您可以在<DataTemplate DataType-"{x:Type t:A}"><t:AView /></DataTemplate>等资源中创建数据模板。绑定到模型实例的内容控件(例如ListBox)将自动搜索正确的DataTemplate 以根据类型显示它。这就是 MVVM 的工作原理。