سؤال

وأريد أن أثبت البيانات في DataGrid wpftoolkit حيث البيانات هي عبارة عن مجموعة من

public class Thing
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public List<Candidate> Candidates { get; set; }
}

public class Candidate
{

    public string Name { get; set; }
    public CandidateType CandidateType { get; set; }
}

public enum CandidateType
{
    Type1,
    Type2,
    Type42
}

وحيث بلغ عدد المرشحين في قائمة المرشحين للتكوين في وقت التشغيل.

وتخطيط الشبكة المرغوب يبدو مثل هذا

وFoo | Bar | Candidate 1 | Candidate 2 | ... | Candidate N

وهكذا يبدو أنني لا يمكن إنشاء DataTemplate للمرشحين في XAML كتعبير ملزمة سيتغير.

وأود أن أضيف الأعمدة اللازمة في حالة AutoGeneratedColumns مثل ذلك:

private void DataGrid_AutoGeneratedColumns(object sender, EventArgs e)
{
    ViewModel vm = DataContext as ViewModel;

    for (int i = 0; i < vm.LotsOfThings.First().Candidates.Count; i++)
    {
        string assName = Assembly.GetExecutingAssembly().GetName().Name;
        ParserContext ctx = new ParserContext();
        ctx.XamlTypeMapper = new XamlTypeMapper(new string[] { assName });
        ctx.XamlTypeMapper.AddMappingProcessingInstruction("src", "WpfToolkitDataGridTester", assName);
        ctx.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
        ctx.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
        ctx.XmlnsDictionary.Add("src", "clr-namespace:WpfToolkitDataGridTester;assembly=" + assName);
        var template = XamlReader.Parse(@"<DataTemplate>
                                            <DataTemplate.Resources>
                                                <src:FooConverter x:Key='fooConverter' />
                                            </DataTemplate.Resources>
                                            <TextBlock  
                                                Foreground='{Binding Candidates[" + i + @"].CandidateType,Converter={StaticResource fooConverter}}'
                                                Text='{Binding Candidates[" + i + @"].Name}' />
                                        </DataTemplate>", ctx) as DataTemplate;
        dg.Columns.Add(new DataGridTemplateColumn
        {
            Header = "Candidate " + (i + 1),
            CellTemplate = template
        });
    }
}

ولكن هذا فشل مع الاستثناء التالي: و"FooConverter" سمة غير موجود في XML مساحة الاسم 'CLR-مساحة الاسم: WpfToolkitDataGridTester، التجمع = WpfToolkitDataGridTester. خط '3' الموقف '54'.

وتغيير StaticResource إلى DynamicResource يجعل أي تغيير.

ما أنا في عداد المفقودين؟

وFWIW: أ datatemplate ضمنية

<DataTemplate x:Key="candidateTemplate">
  <DataTemplate.Resources>
    <src:FooConverter x:Key="fooConverter" />
  </DataTemplate.Resources>
  <TextBlock 
    Foreground="{Binding Candidates[0].CandidateType,Converter={StaticResource fooConverter}}"
    Text="{Binding Candidates[0].Name}" />
</DataTemplate>

ووالعمود قالب محددة مثل ذلك

<wpftk:DataGridTemplateColumn CellTemplate="{StaticResource candidateTemplate}" />

'يعمل' ولكن من الواضح أنها لا تعطي النتيجة المرجوة كمرشحين [0] هو ضمني.

هل كانت مفيدة؟

المحلول

لسبب ما، وأنها تعمل كما هو متوقع إذا كنت تفعل مثل هذا ...

    string assName = Assembly.GetExecutingAssembly().GetName().Name;
    StringBuilder sb = new StringBuilder();
    sb.Append("<DataTemplate ");
    sb.Append("xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
    sb.Append("xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' ");
    sb.Append("xmlns:src='clr-namespace:WpfToolkitDataGridTester;assembly=" + assName + "' >");
    sb.Append("<DataTemplate.Resources>");
    sb.Append("<src:FooConverter x:Key='fooConverter' />");
    sb.Append("</DataTemplate.Resources>");
    sb.Append("<TextBlock ");
    sb.Append("Foreground='{Binding Candidates[" + i + "].CandidateType,Converter={StaticResource fooConverter}}' ");
    sb.Append("Text='{Binding Candidates[" + i + @"].Name}' />");
    sb.Append("</DataTemplate>");
    var template = (DataTemplate)XamlReader.Parse(sb.ToString());

نصائح أخرى

وعندما يتم تجميع الملفات XAML لBAML فإنه يرجع <م> التجمع ليس المصدر في الذاكرة. منذ يتم ترجمة BAML في نفس التجمع النوع الفعلي غير متوفرة بعد.

ولقد وجدت أن الحل على المدى القصير هو تعليق خارج النمط مؤقتا، بناء المشروع، ثم استعادة النمط.

والحل أكثر ديمومة ولكن هو لتحريك تحويل إلى التجميع آخر.

هل من مساعدة للإعلان عن FooConverter مرة واحدة على مستوى أعلى (ربما كمورد للDataGrid) بدلا من كل DataTemplate؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top