9

サンプル デモ VS 2010 RC サンプル プロジェクトを作成しました。これは、本番プロジェクトで MVVM を使用して同じエラーが発生したためです。

私のサンプル デモ プロジェクトでは、サード パーティの依存関係のないコード ビハインドのみを使用しているため、デモ プロジェクトをここからダウンロードして、自分で実行できます: http://www.sendspace.com/file/mwx7wv

問題は次のとおりです。女の子/男の子のボタンをクリックすると、データテンプレートが切り替わるはずです。

私は何を間違っていますか?

OK、ここにもコードスニペットを提供します:

分離コード MainWindow.cs :

namespace ContentTemplateSelectorDemo
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Person person;

        public MainWindow()
        {
            InitializeComponent();

            person = new Person(){ Gender = "xxx"};
            person.IsBoy = true;    

            ContentGrid.DataContext = person;
        }

        private void btnBoys_Click(object sender, RoutedEventArgs e)
        {
            person.IsBoy = true;
            person.IsGirl = false;
            this.ContentGrid.DataContext = person;
        }

        private void btnGirls_Click(object sender, RoutedEventArgs e)
        {
            person.IsGirl = true;
            person.IsBoy = false;
            this.ContentGrid.DataContext = person;    
        }        
    }
}

XAML MainWindow.xaml:

<Window x:Class="ContentTemplateSelectorDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ContentTemplateSelectorDemo"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>            
        <DataTemplate x:Key="girlsViewTemplate">
            <local:UserControl1 />
        </DataTemplate>

        <DataTemplate x:Key="boysViewTemplate" >
            <local:UserControl2 />
        </DataTemplate>

        <local:PersonDataTemplateSelector x:Key="PersonSelector" />            
    </Window.Resources>

    <Grid x:Name="ContentGrid" >
        <StackPanel>
            <Button Name="btnGirls" Click="btnGirls_Click">Switch Girls</Button>
            <Button Name="btnBoys" Click="btnBoys_Click">Switch Boys</Button>
        <ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource ResourceKey=PersonSelector}" />
        </StackPanel>
    </Grid>
</Window>

DataTemplateSelector クラス:

public class PersonDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item,DependencyObject container)
    {
        if (item is Person)
        {
            Person person = item as Person;

            Window window = Application.Current.MainWindow;

            if (System.ComponentModel.DesignerProperties.GetIsInDesignMode( window))
                return null;

            if (person.IsBoy)               
                return window.FindResource("boysViewTemplate") as DataTemplate;
            if (person.IsGirl)            
                return window.FindResource("girlsViewTemplate") as DataTemplate;

        }
        return null;
    }
}

:)

4

3 に答える 3

5

私はニールの解決策が好きです(あなたが提供したリンクを介してジョシュの投稿にあります):

<DataTemplate DataType="{x:Type local:MyType}">
    <ContentPresenter Content="{Binding}" Name="cp" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=IsRunning}" Value="True">
            <Setter TargetName="cp" Property="ContentTemplate" Value="{StaticResource StopTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsRunning}" Value="False">
            <Setter TargetName="cp" Property="ContentTemplate" Value="{StaticResource StartTemplate}" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

編集:上記のコードを実際に機能させることはできませんでしたが、これはスタイルを使用して機能します:

<ContentControl DockPanel.Dock="Bottom" >
    <ContentControl.Style>
        <Style>      
            <Style.Triggers> 
                <DataTrigger Binding="{Binding Path=SourceSystem.SourceSystemName}" Value="mysite.com">
                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource mysiteToolbar}" />
                </DataTrigger>

                <DataTrigger Binding="{Binding Path=SourceSystem.SourceSystemName}" Value="mysite2.com">
                    <Setter Property="ContentControl.ContentTemplate" Value="{StaticResource mysiteToolbar2}" />
                </DataTrigger>
            </Style.Triggers>            
        </Style>
    </ContentControl.Style>  
</ContentControl>
于 2010-10-12T22:43:57.217 に答える
3

:この方法はかなり不器用だと思いますが、一部のシナリオでは機能する可能性があります。別の回答として投稿したトリガー(Neilから)を使用する方法が好きです。


Content別の可能な方法は、ContentTemplateSelectorを選択する必要のあるテンプレートを決定するプロパティにバインドすることです。たとえば、ここでは、の値に基づいて2つの異なるツールバーを選択していますSourceSystemContentをsourcesystemプロパティ自体に設定し ました。

<ContentControl ContentTemplateSelector="{StaticResource toolbarTemplateSelector}" 
                DataContext="{Binding}" Content="{Binding SourceSystem}" />

テンプレートセレクターは、単にソースシステムを調べて、必要なテンプレートを返します。

テンプレートがコントロールのデータコンテキストにアクセスする必要がある場合は、要素バインディングを使用して設定します。

 <UserControl.Resources>
    <DataTemplate x:Key="toolbar1">
        <views:OrdersToolbar1View Margin="0,5,0,0" 
               DataContext="{Binding ElementName=control,Path=DataContext}"/>
    </DataTemplate>
    <DataTemplate x:Key="toolbar2">
        <views:OrdersToolbar2View Margin="0,5,0,0" 
               DataContext="{Binding ElementName=control,Path=DataContext}"/>
    </DataTemplate>
 </UserControl.Resources>
于 2010-10-12T22:54:17.600 に答える
-2

カスタム コンテンツ セレクターには、次の方法を使用します。

private void ReloadContent()
{
    MainContentControl.ContentTemplate = MainContentControl.ContentTemplateSelector.SelectTemplate(null, MainContentControl);
}

xaml で:

<ContentControl Content="{Binding}" x:Name="MainContentControl">
    <ContentControl.ContentTemplateSelector >
            <templateSelectors:MainViewContentControlTemplateSelector>
                <templateSelectors:MainViewContentControlTemplateSelector.BoysTemplate>
                    <DataTemplate>
                       <local:UserControl1 />
                    </DataTemplate>
                    </templateSelectors:MainViewContentControlTemplateSelector.BoysTemplate>
                <templateSelectors:MainViewContentControlTemplateSelector.GirlsTemplate>
                    <DataTemplate>
                        <local:UserControl2 />
                     </DataTemplate>
                     </templateSelectors:MainViewContentControlTemplateSelector.GirlsTemplate>
    </ContentControl>

そしてセレクター:

public class MainViewContentControlTemplateSelector : DataTemplateSelector
{
    public DataTemplate BoysTemplate{ get; set; }
    public DataTemplate GirlsTemplate{ get; set; }


    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var contentControl = container.GetVisualParent<ContentControl>();
        if (contentControl == null)
        {
            return BoysTemplate;
        }

        if (//Condition)
        {
            return GirlsTemplate;

        }

        return BoysTemplate;
    }
于 2013-07-26T09:48:09.650 に答える