3

(Wpf,.Net4)

嘿,当我使用带有 DataType(并且没有键)的数据模板时,它仅适用于构造函数。(我必须那样使用它,因为我有两种不同的类型)。问题是,它可以在 .net 3.5 上运行,现在我需要升级到 .net 4。(我玩过项目的属性,发现它可以在 3.5 上运行)这是整个代码(除了默认的 App .xaml):

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" x:Name="me"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <ToolBar ItemsSource="{Binding ElementName=me, Path=Items}">
            <ToolBar.Resources>
                <DataTemplate  DataType="{x:Type local:Class1}">
                    <TextBlock Text="{Binding Title}" />
                </DataTemplate>
            </ToolBar.Resources>
        </ToolBar>

        <StackPanel Grid.Row="1">
            <Button Content="1"  Click="Button_Click"/>
        </StackPanel>
    </Grid>
</Window>

主窗口.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Items = new ObservableCollection<Class1>();
            Items.Add(new Class1() { Title = "1" });

            InitializeComponent();
        }

        public ObservableCollection<Class1> Items { get; set; }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Items.Add(new Class1() { Title = (Items.Count + 1).ToString() });
        }
    }

    public class Class1
    {
        public string Title { get; set; }
    }
}

按钮动态添加项目,我们可以看到第一个显示它的标题,并且动态添加的项目没有应用模板。我能做些什么?谢谢。

4

2 回答 2

3

显然渲染后不再Toolbar使用默认Class1模板。根据要求,有几种解决方案可以在这里工作。

1)DataTemplate在 App.xaml 中定义:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary>
                <DataTemplate DataType="{x:Type TestWPF:Class1}">
                    <TextBlock Text="{Binding Title}" />
                </DataTemplate>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

假设您那里还有一些其他资源字典。如果没有,DataTemplate可以直接放入Application.Resources没有所有字典的东西。

2)当一个对象没有默认模板时,它只是使用它的ToString方法来直观地表示自己。所以你Class1(和其他人)可以覆盖ToString

public class Class1
{
    public string Title { get; set; }

    public override string ToString()
    {
       return Title;
    }
}

3) ItemControls 的标准 WPF 方法 - 有ItemTemplate

 <ToolBar ItemsSource="{Binding ElementName=me, Path=Items}">
     <ToolBar.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Title}" />
         </DataTemplate>
     </ToolBar.ItemTemplate>
 </ToolBar>

但是您说有几种类型应该具有模板,因此要使其正常工作,您必须ToolBar.

于 2013-04-16T08:39:14.533 回答
0

此问题有第四个解决方法 - 您需要使用另一个集合来形成新的工具栏内容,然后将此集合的值分配给 Items

于 2014-05-27T12:43:33.380 回答