【问题标题】:How can I make WPF instantiate a custom control in my view, using another custom control base class in my XAML?如何使用 XAML 中的另一个自定义控件基类使 WPF 在我的视图中实例化自定义控件?
【发布时间】: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,你有两个模型 - AB。您为它们设计了两个视图:AView : BaseViewBView : VaseView。您可以在&lt;DataTemplate DataType-"{x:Type t:A}"&gt;&lt;t:AView /&gt;&lt;/DataTemplate&gt; 等资源中创建数据模板。绑定到模型实例的内容控件(例如ListBox)将自动搜索正确的DataTemplate 以根据类型显示它。这就是 MVVM 的工作原理。

标签: c# .net wpf xaml mvvm


【解决方案1】:

首先将您想要的两个数据模板定义为资源:

<DataTemplate x:Key="case1">
 <c:PathControl />
</DataTemplate>

然后是另一个

<DataTemplate x:Key="case2">
 <c:TestControl />
</DataTemplate>

现在创建一个 DataTemplateSelector

public class SelectionTemplateSelector : DataTemplateSelector
{
public DataTemplate Case1Template { get; set; }
public DataTemplate Case2Template { get; set; }

public override DataTemplate SelectTemplate(object item, 
DependencyObject container)
{

if( //Get the binding you need)
return Case1Template ;
else
return Case2Template ;
}
}

现在添加另一个资源:

 <c:SelectionTemplateSelector 
    ImageTemplate="{StaticResource case1}" 
    StringTemplate="{StaticResource case2}" 
    x:Key="SelectionTemplateSelector " />

最后改为添加数据模板添加

ItemTemplateSelector="{StaticResource SelectionTemplateSelector }"

【讨论】:

  • 感谢您的快速回答,但我不够清楚。我的 ComboBox 的内容是动态的,我希望从 DLL 加载从 PathControl 继承的类。我希望有一个可由其他程序员扩展的应用程序。还有可能吗?也许我应该提出另一个问题。还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多