2015-04-29 60 views
2

我有5列的ListView:如何讓WPF在我的視圖中實例化一個自定義控件,在我的XAML中使用另一個自定義控件基類?

<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等系統testControl從PathControl

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。

根據自定義控件的實例化,鼠標綁定將調用不同的方法。

這有可能嗎?有沒有另外一種方法來實現這一點?

+0

使用MVVM,你有兩個型號 - A''和'B'。您爲它們設計了兩個視圖:'AView:BaseView'和'BView:VaseView'。你可以在你的資源中創建數據模板,比如' {'等。綁定到模型實例的內容控件(例如ListBox)將自動搜索出正確的DataTemplate以用於基於類型顯示它。這就是MVVM的工作原理。 – Will

回答

0

首先定義爲資源,你要喜歡這兩個的DataTemplates:

<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 " /> 

最後,而不是添加一個DataTemplate添加

ItemTemplateSelector="{StaticResource SelectionTemplateSelector }" 
+0

感謝您的快速回答,但我並不清楚。我的ComboBox的內容是動態的,我想從PathControl繼承的類從DLL加載。我想有一個可由其他程序員擴展的應用程序。它仍然有可能嗎?也許我應該創造另一個問題。不管怎麼說,還是要謝謝你 – Morgan

相關問題