سؤال

أنا أحاول عرض تلميح الأدوات لكل عنصر الناتجة عن ItemsControl التي تحتاج إلى سحب البيانات من الناحية النظرية لا علاقة لها مصادر.على سبيل المثال ، يقول لدي الدرجة البند على النحو التالي:

public class Item
{
    public string ItemDescription { get; set; }
    public string ItemName { get; set; }
}

لا يمكن عرض هذا البند في ItemsControl مع تلميح الأدوات على النحو التالي:

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ItemName}">
                <TextBlock.ToolTip>
                    <ToolTip>
                        <TextBlock Text="{Binding ItemDescription}" />
                    </ToolTip>
                </TextBlock.ToolTip>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ولكن القول لدي خاصية أخرى يمكن الوصول إليها عبر DataContext من ItemsControl.هل هناك أي طريقة للقيام بذلك من داخل تلميح الأدوات?E. g. ،

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ItemName}">
                <TextBlock.ToolTip>
                    <ToolTip>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding ItemDescription}" />
                            <TextBlock Grid.Row="1" Text="{Bind this to another property of the ItemsControl DataContext}" />
                        </Grid>
                    </ToolTip>
                </TextBlock.ToolTip>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

رمز اختبار نافذة اعتدت على النحو التالي:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        List<Item> itemList = new List<Item>() {
            new Item() { ItemName = "First Item", ItemDescription = "This is the first item." },
            new Item() { ItemName = "Second Item", ItemDescription = "This is the second item." } 
        };

        this.Items = itemList;
        this.GlobalText = "Something else for the tooltip.";
        this.DataContext = this;
    }

    public string GlobalText { get; private set; }

    public List<Item> Items { get; private set; }
}

حتى في هذا المثال أريد أن تظهر قيمة GlobalText الملكية (في الواقع هذا سيكون مخصص آخر كائن).

إلى تعقيد الأمور, أنا في الواقع باستخدام DataTemplates وتظهر اثنين من أنواع مختلفة من الكائنات داخل ItemsControl ، ولكن أي مساعدة سيكون موضع تقدير كبير!

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

المحلول

وبعد ساعة من سحب الشعر لقد جئت إلى قناعة أنه لا يمكن الرجوع DataContext آخر داخل DataTemplate <م> لتلميح الأدوات . لالربط الأخرى فمن الممكن تماما كما أثبتت ملصقات أخرى. لهذا السبب لا يمكنك استخدام خدعة RelativeSource سواء. ما يمكنك القيام به هو تطبيق خاصية ثابتة في صفك البند والمرجعية <م> أن :

<Window x:Class="ToolTipSpike.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    Name="Root"
    xmlns:ToolTipSpike="clr-namespace:ToolTipSpike">
    <Grid>
        <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Items}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding ItemName}"> 
                        <TextBlock.ToolTip>
                            <ToolTip>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition />
                                        <RowDefinition />
                                    </Grid.RowDefinitions>
                                    <TextBlock Text="{Binding ItemDescription}" />
                                    <TextBlock Grid.Row="1" 
                   Text="{Binding Source={x:Static ToolTipSpike:Item.GlobalText},
                   Path=.}"
                                    />
                                </Grid>
                            </ToolTip>
                        </TextBlock.ToolTip>
                    </TextBlock>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

using System.Collections.Generic;
using System.Windows;

namespace ToolTipSpike
{
    public partial class Window1 : Window
    {

        public List<Item> Items { get; private set; }
        public Window1()
        {
            InitializeComponent();
            var itemList = new List<Item>
                  {
                      new Item { ItemName = "First Item", ItemDescription = "This is the first item." },
                      new Item { ItemName = "Second Item", ItemDescription = "This is the second item." }
                  };
            this.Items = itemList;
            this.DataContext = this;
       }
    }

     public class Item
     {
         static Item()
         {
             GlobalText = "Additional Text";
         }
         public static string GlobalText { get; set; }
         public string ItemName{ get; set;}
         public string ItemDescription{ get; set;}
     }
}

نصائح أخرى

المحاولة الثانية

طيب النسبي المصدر الربط لا يعمل في هذه الحالة.كان يعمل في الواقع من البيانات قالب يمكنك أن تجد أمثلة كثيرة من هذا على الإنترنت.ولكن هنا (كنت على حق, ديفيد, في تعليقك) تلميح خاص الوحش التي لم يتم وضعها بشكل صحيح في VisualTree (إنه الملكية ، وليس التحكم في حد ذاته) و لا يجب الوصول إلى اسم مناسب نطاق استخدام النسبية ملزمة.

بعد بعض البحث وجدت هذه المادة, الذي يصف هذا التأثير في التفاصيل و يقترح تنفيذ BindableToolTip.

قد تكون مبالغة, لأن لديك خيارات أخرى -- مثل استخدام خاصية ثابتة على فئة (كما في Dabblernl رد) أو إضافة جديدة سبيل المثال الممتلكات الخاصة بك Item.

المحاولة الأولى :)

يجب أن يتشاور مع النسبية مصدر ملزم أنواع (في هذه ورقة الغش على سبيل المثال):

لذلك ملزم سوف ننظر بطريقة أو بأخرى مشابهة لهذه:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}, Path= GlobalText}

تقريبا الصحيح Yacoder و تفكر بطريقة خاطئة هناك Dabblernl ;)

طريقة تفكيرك صحيحة فمن الممكن أن مرجع DataContext من ItemsControl

كنت في عداد المفقودين DataContext الملكية في المسار:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.GlobalText}

المحاولة الثانية ;)

http://blogs.msdn.com/tom_mathews/archive/2006/11/06/binding-a-tooltip-in-xaml.aspx

هنا هو المادة مع نفس المشكلة.أنها يمكن أن تشير DataContext الوالدين مراقبة من قبل PlacementTarget الملكية:

<ToolTip DataContext=”{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Parent}”>

لو كنت مكان DataContext على مستوى أعمق ، يمكنك تجنب تغيير البند الخاص بك DataContext

وهناك اقتراح ثاني (نيل آدم سميث) كان يمكن أن نستخدمها PlacementTarget في ملزمة.هذا هو لطيف ، كما أنا في الواقع وراثة DataContext بالفعل من الصفحة التي تستضيف DataControl, و هذا من شأنه أن يسمح تلميح الأدوات للوصول إلى origial التحكم.كما آدم لوحظ ، على الرغم من أنك يجب أن تكون على بينة من الوالدين/الطفل الهيكل قبالة العلامات الخاص بك:

وهذه هي الحالة التي يكون فيها أعتقد أنه من المفهوم الأنسب للقيام بذلك في نموذج عرض مما هو عليه في وجهة النظر على أي حال. كشف المعلومات تلميح إلى العرض كخاصية في هذا البند عرض النموذج. التي تسمح للرأي تفعل ما في الأمر الجيد في (خصائص عرض هذا البند) ونموذج عرض تفعل ما هو أنه كان جيدا في (تحديد ما هي المعلومات التي يجب أن تقدم).

وكان لي مشكلة مماثلة جدا وصلت إلى هذا السؤال يبحثون عن إجابات. في نهاية خطرت لي حلا مختلفا التي عملت في حالتي وقد تكون مفيدة للآخرين.

في حل بي، وأضفت خاصية لهذا البند الطفل يشير نموذج الأم، ويسكنها عندما تم إنشاؤها الأطفال. في XAML لتعريف الأدوات، ثم انني ببساطة المشار إليها الخاصية من نموذج الأصل على كل عنصر وتعيين DataContext إلى الخاصية نموذج الأم.

وشعرت براحة أكبر مع هذا الحل من إنشاء عناصر بالوكالة في XAML والرجوع إليها.

<ع> استخدام رمز المثال لهذا السؤال، عليك أن تفعل ما يلي: ملاحظة انني لم اختبر هذا السيناريو في المجمع، ولكن قد فعلت ذلك بنجاح تنفيذ هذا الحل في رمز للسيناريو الخاص.

الصنف:

public class Item
{
    public List<Item> Parent { get; set; }
    public string ItemDescription { get; set; }
    public string ItemName { get; set; }
}

نافذة:

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List<Item> itemList = new List<Item>();
            itemList.Add(new Item() { Parent = this, ItemName = "First Item", ItemDescription = "This is the first item." });
            itemList.Add(new Item() { Parent = this, ItemName = "Second Item", ItemDescription = "This is the second item." });


            this.Items = itemList;
            this.GlobalText = "Something else for the tooltip.";
            this.DataContext = this;
        }

        public string GlobalText { get; private set; }

        public List<Item> Items { get; private set; }
    }

وXAML:

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ItemName}">
                <TextBlock.ToolTip>
                    <ToolTip>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding ItemDescription}" />
                            <TextBlock Grid.Row="1" DataContext={Binding Parent} Text="{Bind this to aproperty of the parent data model}" />
                        </Grid>
                    </ToolTip>
                </TextBlock.ToolTip>
            </TextBlock>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top