Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TemplateSelector不';行不通_C#_Xaml_Uwp_Win Universal App_Windows 10 Universal - Fatal编程技术网

C# TemplateSelector不';行不通

C# TemplateSelector不';行不通,c#,xaml,uwp,win-universal-app,windows-10-universal,C#,Xaml,Uwp,Win Universal App,Windows 10 Universal,我有项控件,但我想改进此代码,以便处理不同类型的输入数据 <Grid> <ItemsControl x:Name="control" VerticalAlignment="Center" HorizontalAlignment="Center" ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" ItemTempla

我有
项控件
,但我想改进此代码,以便处理不同类型的输入数据

<Grid>
    <ItemsControl x:Name="control"
              VerticalAlignment="Center"
              HorizontalAlignment="Center"
              ItemsSource="{x:Bind ItemsSource, Mode=OneWay}"
              ItemTemplate="{x:Bind CellTemplate, Mode=OneWay, Converter={StaticResource SimpleSelector}}">

    <!--I want make like this-->
    <ContentControl VerticalAlignment="Stretch"
                    HorizontalAlignment="Stretch"
                    ContentTemplate="{Binding SelectedCollageTemplate, Converter={StaticResource CollageTemplateSelector}}" />
    <!-- -->
<!--now I have this-->
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <controls:SimplePanel SelectedCollage="{Binding SelectedCollage, Mode=TwoWay}"
            SelectedCollagePattern="{Binding SelectedCollagePattern}">
        <controls:SimplePanel.Background>
     <ImageBrush Stretch="Fill"
                 ImageSource="ms-appx:///Images/Background/5.jpg" />
        </controls:SimplePanel.Background>
            </controls:SimplePanel>          
  </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- -->
</ItemsControl>


</Grid>
并添加了
DataTemplate

<DataTemplate x:Key="SimpleTemplate">
<controls:SimplePanel
                  SelectedCollage="{Binding SelectedCollage, Mode=TwoWay}"
                  SelectedCollagePattern="{Binding SelectedCollagePattern}">
    <controls:SimplePanel.Background>
        <ImageBrush Stretch="Fill"
                ImageSource="ms-appx:///Images/Background/5.jpg" />
    </controls:SimplePanel.Background>
</controls:SimplePanel>

我的转换器返回简单的面板。但是当我启动它时,我的
SimplePanel
没有启动(我在构造函数上有断点),并且部分代码不起作用。我有什么问题

  • 您正在将
    ContentControl
    ContentTemplate
    设置为选择器;您应该改为设置
    ContentTemplateSelector
    属性

  • ItemsControl
    中,您正在将
    ItemsTemplate
    设置为类似于模板选择器的内容;您应该改为设置
    ItemsTemplateSelector
    属性

  • 您不应该绑定到模板选择器,而是作为
    StaticResource
    s访问它们

  • 我不完全理解您尝试执行的操作的细节,因此这里有一个
    DataTemplateSelector
    的示例

    首先,我使用以下
    ItemsSource
    ,目的是使字符串“Three”显示为红色:

    public string[] ItemsSource => new[]
        {
            "One", "Two", "Three",
        };
    
    模板选择器有两个
    DataTemplate
    属性,将从XAML设置它们——一个用于“三个”字符串;另一个用于所有其他字符串:

    public sealed class ItemTemplateSelector : DataTemplateSelector
    {
        /// <summary>
        /// This property is set in XAML.
        /// </summary>
        public DataTemplate NormalTemplate { get; set; }
    
        /// <summary>
        /// This property is set in XAML.
        /// </summary>
        public DataTemplate ThreeTemplate { get; set; }
    
        protected override DataTemplate SelectTemplateCore(object item)
        {
            if ("Three".Equals(item))
            {
                return ThreeTemplate;
            }
    
            return NormalTemplate;
        }
    
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            return SelectTemplateCore(item);
        }
    }
    
    结果如下所示,字符串“三”显示为红色:


    我希望这足以让您走上正确的道路。

    关于重写这两个
    DataTemplateSelector
    方法的警告确实有所帮助。是的,该页面提到了它,但不幸的是,其他描述如何编写自己的选择器的MS文档页面没有。。。
    public sealed class ItemTemplateSelector : DataTemplateSelector
    {
        /// <summary>
        /// This property is set in XAML.
        /// </summary>
        public DataTemplate NormalTemplate { get; set; }
    
        /// <summary>
        /// This property is set in XAML.
        /// </summary>
        public DataTemplate ThreeTemplate { get; set; }
    
        protected override DataTemplate SelectTemplateCore(object item)
        {
            if ("Three".Equals(item))
            {
                return ThreeTemplate;
            }
    
            return NormalTemplate;
        }
    
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            return SelectTemplateCore(item);
        }
    }
    
    <Grid>
        <Grid.Resources>
            <local:ItemTemplateSelector x:Key="ItemTemplateSelector">
                <local:ItemTemplateSelector.NormalTemplate>
                    <DataTemplate>
                        <TextBlock Foreground="Blue" Text="{Binding}" />
                    </DataTemplate>
                </local:ItemTemplateSelector.NormalTemplate>
                <local:ItemTemplateSelector.ThreeTemplate>
                    <DataTemplate>
                        <TextBlock Foreground="Red" Text="{Binding}" />
                    </DataTemplate>
                </local:ItemTemplateSelector.ThreeTemplate>
            </local:ItemTemplateSelector>
        </Grid.Resources>
        <ItemsControl
            VerticalAlignment="Center"
            HorizontalAlignment="Center"
            ItemsSource="{x:Bind ItemsSource, Mode=OneWay}"
            ItemTemplateSelector="{StaticResource ItemTemplateSelector}">
        </ItemsControl>
    </Grid>