Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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_C# 4.0 - Fatal编程技术网

C# 创建数据模板代码隐藏

C# 创建数据模板代码隐藏,c#,wpf,c#-4.0,C#,Wpf,C# 4.0,我正在尝试为show data创建一个列表框视图,我希望它包含一个列表框,其中包含两列“Product ID&Product Barcode”的datatemplate 我想使用纯C代码创建它,或者如果可能,通过xaml加载它?如果我能创建一个模板,我就可以在c#中获得某种资源 到目前为止,我所做的是: 在XAML中: <Grid> <Grid.RowDefinitions> <RowDefinition Height="37*" />

我正在尝试为show data创建一个列表框视图,我希望它包含一个列表框,其中包含两列“Product ID&Product Barcode”的datatemplate

我想使用纯C代码创建它,或者如果可能,通过xaml加载它?如果我能创建一个模板,我就可以在c#中获得某种资源

到目前为止,我所做的是: 在XAML中:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="37*" />
        <RowDefinition Height="88*" />
    </Grid.RowDefinitions>
    <TextBlock Text="Type Your Search :" HorizontalAlignment="Left"  VerticalAlignment="Bottom" Width="112" Height="15.96" Margin="20,0,0,4" />

    <TextBox HorizontalAlignment="Right" VerticalAlignment="Bottom" Height="25" Width="300" Margin="0,0,44,0" x:Name="txtCAuto" TextWrapping="NoWrap" HorizontalContentAlignment="Right" />

    <ListBox x:Name="lbSuggestion" SelectionChanged="lbSuggestion_SelectionChanged" Foreground="Black" Width="300" Margin="0,0,44,0"  FlowDirection="RightToLeft" Background="LightYellow" Grid.Row="1" Visibility="Collapsed"  ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding}"  HorizontalAlignment="Right" VerticalAlignment="Top" HorizontalContentAlignment="Right" BorderBrush="Transparent"  Grid.IsSharedSizeScope="True">
    </ListBox>
</Grid>

在代码隐藏中:

string typedString = txtCAuto.Text.ToUpper();
        List<string> autoList = new List<string>();
        autoList.Clear();

         prodDetails ps = SelProd4Sale();

        foreach (string item in ps.ProdBrcdList)
        {
            if (!string.IsNullOrEmpty(txtCAuto.Text))
            {
                if (item.StartsWith(typedString))
                {
                    //autoList.Add(item);
                    FrameworkElementFactory colProdID = new FrameworkElementFactory(typeof(TextBlock));
                    Binding prodID = new Binding(ps.ProdIDList.ToString());
                    colProdID.SetBinding(TextBlock.TextProperty, prodID);

                    FrameworkElementFactory colProdBarcode = new FrameworkElementFactory(typeof(TextBlock));
                    Binding prodBarcode = new Binding();
                    prodBarcode.Path = new PropertyPath(ps.ProdBrcdList.ToString());
                    colProdBarcode.SetBinding(TextBlock.TextProperty, prodBarcode);


                    FrameworkElementFactory sb = new FrameworkElementFactory(typeof(StackPanel));
                    sb.AppendChild(colProdID);
                    sb.AppendChild(colProdBarcode);

                    dTemplate = new DataTemplate { VisualTree = sb };
                    dTemplate.Seal();


                }
            }
        }

        if (autoList.Count > 0)
        {
            lbSuggestion.ItemTemplate = dTemplate;
            //lbSuggestion.ItemsSource = autoList;
            lbSuggestion.Visibility = Visibility.Visible;
        }
        else if (txtCAuto.Text.Equals(""))
        {
            lbSuggestion.Visibility = Visibility.Collapsed;
            lbSuggestion.ItemsSource = null;
        }
        else
        {
            lbSuggestion.Visibility = Visibility.Collapsed;
            lbSuggestion.ItemsSource = null;
        }
string typedString=txtCAuto.Text.ToUpper();
List autoList=新列表();
autoList.Clear();
prodDetails ps=SelProd4Sale();
foreach(ps.ProdBrcdList中的字符串项)
{
如果(!string.IsNullOrEmpty(txtCAuto.Text))
{
if(项目启动(类型字符串))
{
//自动列表。添加(项目);
FrameworkElementFactory colProdID=新的FrameworkElementFactory(typeof(TextBlock));
Binding prodID=新绑定(ps.ProdIDList.ToString());
colProdID.SetBinding(TextBlock.TextProperty,prodID);
FrameworkElementFactory colProdBarcode=新FrameworkElementFactory(typeof(TextBlock));
Binding prodBarcode=新绑定();
ProdBrcdList.ToString());
colProdBarcode.SetBinding(TextBlock.TextProperty,prodBarcode);
FrameworkElementFactory sb=新FrameworkElementFactory(类型(StackPanel));
某人的孩子(colProdID);
某人的孩子(colProdBarcode);
dTemplate=newdatatemplate{VisualTree=sb};
dTemplate.Seal();
}
}
}
如果(autoList.Count>0)
{
lbSuggestion.ItemTemplate=dTemplate;
//lbSuggestion.ItemsSource=自动列表;
lbSuggestion.Visibility=可见性.Visibility;
}
else if(txtCAuto.Text.Equals(“”)
{
lbSuggestion.Visibility=Visibility.Collapsed;
lbSuggestion.ItemsSource=null;
}
其他的
{
lbSuggestion.Visibility=Visibility.Collapsed;
lbSuggestion.ItemsSource=null;
}
但没有数据显示,请提供任何建议。
谢谢,

如果定义了
x:Key,您可以在xaml中定义资源,并在代码隐藏中检索资源

在您的xaml中:

<DataTemplate x:Key="anyId">...</DataTemplate>


我创建了如下数据模板:

private DataTemplate getDataTemplate()
{
    DataTemplate retVal = null;
    String markup = String.Empty;

    markup = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:local=\"clr-namespace:YOUR.PROJECT.NAMESPACE;assembly=YOUR.PROJECT.NAMESPACE\">";
    markup += "<Grid>";
    markup += "<TextBlock Text=\"{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Content, Mode=OneWay}\" />";
    markup += "</Grid>";
    markup += "</DataTemplate>";

    retVal = (DataTemplate)XamlReader.Load(markup);

    return retVal;
}
注意:您可能必须更改WPF的“xmlns”,因为此示例取自我的一个Silverlight项目。但是想法是一样的。

条件XAML数据模板 在对象的XAML文件中定义静态数据模板是实现这一点的惯用方法。另外,Microsoft为DataTemplate.LoadContent()提供的示例很好地展示了如何在需要时在运行时动态切换模板(请参阅)

但是,如果您对条件XAML编译有特殊要求(如在构建发布版本时省略仅调试XAML),则需要采用XamlReader.Load()方法(请参阅)

为此,我认为更详细一点的示例可能会有所帮助。这里,我有一个仅调试的ListView,它绑定到自定义对象的ObservableCollection。ListView不是在静态XAML中定义的,因为它只在调试模式下需要


自定义类:

    class ActiveNotification
    {
        public String Name { get; set; }
        public String Type { get; set; }
        public String DayOfWeek { get; set; }
        public DateTime DeliveryTime { get; set; }
        public String Id { get; set; }
    }
私有成员变量:

    readonly ObservableCollection<ActiveNotification> _activeNotifications = new ObservableCollection<ActiveNotification>();
    readonly ListView listViewNotifications = 
        new ListView 
        { 
            Visibility = Visibility.Collapsed,
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom,
        };
readonly ObservableCollection\u activeNotifications=new ObservableCollection();
只读ListView listViewNotifications=
新列表视图
{ 
可见性=可见性。已折叠,
水平对齐=水平对齐。左,
垂直对齐=垂直对齐。底部,
};
加载时间列表视图设置:

        // Set up notifications list
        listViewNotifications.SetBinding(ListView.ItemsSourceProperty, new Binding { Source = _activeNotifications });
        listViewNotifications.Tapped += listViewNotifications_Tapped;
        Grid.SetRowSpan(listViewNotifications, 2);
        Grid.SetColumnSpan(listViewNotifications, 2);
        var xamlString =
            "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" +
                "<StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">" +
                    "<TextBlock Text=\"{Binding Name}\" Margin=\"20,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding Type}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding DayOfWeek}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding DeliveryTime}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding Id}\"/>" +
                "</StackPanel>" +
            "</DataTemplate>";
        var dataTemplate = (DataTemplate)XamlReader.Load(xamlString);
        listViewNotifications.ItemTemplate = dataTemplate;
        GridMain.Children.Add(listViewNotifications);
//设置通知列表
SetBinding(ListView.ItemsSourceProperty,新绑定{Source=\u activeNotifications});
listViewNotifications.Tapped+=listViewNotifications\u Tapped;
SetRowSpan(listViewNotifications,2);
SetColumnSpan(listViewNotifications,2);
var xamlString=
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"";
var dataTemplate=(dataTemplate)XamlReader.Load(xamlString);
listViewNotifications.ItemTemplate=数据模板;
GridMain.Children.Add(listViewNotifications);

如果要在code behind中执行,为什么不创建一个自定义的
ListBoxItem
?如果可以在XAML中执行,为什么会有这么多代码。当我尝试在XAML中执行时,也没有数据出现,所以我尝试在CodeBehind中执行。我认为最好的做法是在XAML中创建它,但是我选择用代码来说明它是如何完成的,问题是:-)当我尝试用XAML创建它时,没有数据出现,所以在后面的代码中完成。你必须在XAML文件的资源字典中编写DataTemplate,并自己设置x:Key!我的意思是,您必须设置一个x:Key参数,以便能够检索代码背后的任何资源。回答得好。允许您在XAML中定义数据模板所属的位置,然后在必要时使用它。
    class ActiveNotification
    {
        public String Name { get; set; }
        public String Type { get; set; }
        public String DayOfWeek { get; set; }
        public DateTime DeliveryTime { get; set; }
        public String Id { get; set; }
    }
    readonly ObservableCollection<ActiveNotification> _activeNotifications = new ObservableCollection<ActiveNotification>();
    readonly ListView listViewNotifications = 
        new ListView 
        { 
            Visibility = Visibility.Collapsed,
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom,
        };
        // Set up notifications list
        listViewNotifications.SetBinding(ListView.ItemsSourceProperty, new Binding { Source = _activeNotifications });
        listViewNotifications.Tapped += listViewNotifications_Tapped;
        Grid.SetRowSpan(listViewNotifications, 2);
        Grid.SetColumnSpan(listViewNotifications, 2);
        var xamlString =
            "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" +
                "<StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">" +
                    "<TextBlock Text=\"{Binding Name}\" Margin=\"20,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding Type}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding DayOfWeek}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding DeliveryTime}\" Margin=\"0,0,10,0\"/>" +
                    "<TextBlock Text=\"{Binding Id}\"/>" +
                "</StackPanel>" +
            "</DataTemplate>";
        var dataTemplate = (DataTemplate)XamlReader.Load(xamlString);
        listViewNotifications.ItemTemplate = dataTemplate;
        GridMain.Children.Add(listViewNotifications);