Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# 通过代码使用模板选择器添加数据模板_C#_Wpf_Xaml_Templates - Fatal编程技术网

C# 通过代码使用模板选择器添加数据模板

C# 通过代码使用模板选择器添加数据模板,c#,wpf,xaml,templates,C#,Wpf,Xaml,Templates,我必须通过代码创建一个DataTemplate。这是我的代码: public DataTemplate getTemplate(int r) { string xaml = "<DataTemplate> " + " <ListView Margin=\"0\" x:Name=\"lv0\" ItemTemplateSelector=\"{StaticResource MyTemplateSelector}\"

我必须通过代码创建一个
DataTemplate
。这是我的代码:

    public DataTemplate getTemplate(int r)
    {
        string xaml = "<DataTemplate> " +
                  " <ListView Margin=\"0\" x:Name=\"lv0\" ItemTemplateSelector=\"{StaticResource MyTemplateSelector}\" MinWidth=\"50\"  MinHeight=\"20\"  ScrollViewer.VerticalScrollBarVisibility=\"Hidden\" BorderBrush=\"{x:Null}\" BorderThickness=\".2\" ScrollViewer.HorizontalScrollBarVisibility=\"Hidden\"  HorizontalAlignment=\"Stretch\"  Width=\"Auto\" ItemsSource=\"{Binding Events_" + r + "}\" Foreground=\"{x:Null}\" Background=\"{x:Null}\">" +
                    "  <ListView.ItemContainerStyle>" +
                     "     <Style TargetType=\"ListViewItem\">" +
                      "        <Setter Property=\"Padding\" Value=\"0\"/>" +
                       "       <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />" +
                        "  </Style>" +
                      "</ListView.ItemContainerStyle>" +
                      "<ListView.ItemsPanel>" +
                       "   <ItemsPanelTemplate>" +
                       "       <VirtualizingStackPanel" +
     " Orientation=\"Horizontal\"" +
     " IsItemsHost=\"True\"/>" +
       "                   </ItemsPanelTemplate>" +
        "              </ListView.ItemsPanel>" +            
         "         </ListView>" +
          "    </DataTemplate>";
          MemoryStream sr = null;
        ParserContext pc = null;
        sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml));

        pc = new ParserContext();
        pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");

        pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");

        DataTemplate datatemplate = (DataTemplate)XamlReader.Load(sr, pc);
        return datatemplate;
    }
当我运行代码时,我的
DataTemplate
返回良好。但是当它试图运行时,它找不到名为
MyTemplateSelector
的资源。当我在代码中看到我的
ResourceDictionary
时,我看到选择器的索引在
ResourceDictionary
集合中
DataTemplate
s的索引之下。因此,我假设我的
DataTemplate
正在尝试查找
MyTemplateSelector
,但无法找到,因为它存储在集合的下面


我做错了什么?有什么建议吗?

如果没有清楚显示你在做什么,就很难评论或回答。但是,您是否尝试过在代码中明确查找资源中的选择器,并将其分配给生成的
DataTemplate
对象中的属性(即,在包含的
ListView
模板中)?此外,这并不是说这会影响结果,但我认为对XML流使用UTF8而不是ASCII更为正确。此外,就我个人而言,也许有更好的方法可以做到这一点,但可以肯定的是,我会使用我的代码隐藏预算来明确地设置
itemsource
绑定,而不是与动态生成和解析的XAML搏斗。(至少,从代码示例来看,这似乎是您执行此操作的唯一原因…以便您可以将
r
的变量值格式化到绑定中)。感谢您的快速响应。我真的不知道如何解释这里的事情。您是想说我可以直接使用datatemplate到Xaml中,并且仍然可以动态绑定而不使用代码隐藏吗?我之所以使用代码隐藏,只是因为我找不到如何为创建的不同ListView动态更改我的ItemsSource。是的,在我看来,您应该能够做到这一点。您必须在运行时通过代码隐藏来设置绑定,如果不清楚地说明开始的场景,我就不能真正提出一个确切的示例。最坏的情况是,您必须在XAML中设置一个间接绑定,例如通过您定义的附加属性。但是我认为你应该可以直接设置绑定。请仔细阅读MCVE页面;重要的是,代码示例必须是最小的和完整的。好的,Peter,我会确保接下来提供尽可能多的代码。由于代码对我来说相当混乱,因为我在6年后编写了我的第一个xaml,所以没有编写一个干净的。我将尝试遵循您关于动态绑定的建议。
<Window.Resources>
    <local:TaskListDataTemplateSelector x:Key="MyTemplateSelector"/>
</Window.Resources>