سؤال

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

<Window.Resources>        
    <ContextMenu x:Key="contextMenu" 
                 ItemsSource="{Binding Items, 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" >
        <ContextMenu.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Content}"/>
            </DataTemplate>
        </ContextMenu.ItemTemplate>
    </ContextMenu>

    <Style TargetType="{x:Type ListBox}">
        <Setter Property="ContextMenu" Value="{StaticResource contextMenu}"/>            
    </Style>
</Window.Resources>

يعمل هذا بشكل رائع لمربع قائمة واحد.ومع ذلك، عندما يكون لدي مربع قائمة ثانٍ، تستمر قائمة السياق في إظهار العناصر من مربع القائمة الأول.بمعنى آخر، لا يتغير مصدر العناصر لقائمة السياق.فقط المرة الأولى التي يتم فيها فتح قائمة السياق هي مجموعة الخصائص ItemsSource.على سبيل المثال:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <ListBox x:Name="first" >
        <ListBoxItem>First 1</ListBoxItem>
        <ListBoxItem>First 2</ListBoxItem>
        <ListBoxItem>First 3</ListBoxItem>
        <ListBoxItem>First 4</ListBoxItem>
        <ListBoxItem>First 5</ListBoxItem>
    </ListBox>
    <ListBox x:Name="second" Grid.Column="2" >
        <ListBoxItem>Second 1</ListBoxItem>
        <ListBoxItem>Second 2</ListBoxItem>
        <ListBoxItem>Second 3</ListBoxItem>
        <ListBoxItem>Second 4</ListBoxItem>
        <ListBoxItem>Second 5</ListBoxItem>
    </ListBox>    
</Grid>

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

تحديث:وأخيرا اكتشفت كيفية إصلاحه.أحتاج فقط إلى الارتباط بـ PlacementTarget.Items واستخدام مصدر نسبي ذاتي بدلاً من استخدام مصدر نسبي للبحث عن السلف.

<ContextMenu x:Key="contextMenu" 
  ItemsSource="{Binding PlacementTarget.Items, 
  RelativeSource={RelativeSource Self}}" >
هل كانت مفيدة؟

المحلول

وجدت الإجابة، أحتاج فقط إلى الارتباط بـ PlacementTarget.Items واستخدام مصدر نسبي ذاتي بدلاً من استخدام مصدر نسبي للبحث عن السلف.

<ContextMenu x:Key="contextMenu" 
  ItemsSource="{Binding PlacementTarget.Items, 
  RelativeSource={RelativeSource Self}}" >

نصائح أخرى

أعتقد أن المشكلة التي تواجهها هنا ترجع إلى حقيقة أن قائمة السياق جزء من شجرة مرئية مختلفة.أي أنه لا يمكنك العثور على أصل ListBox لأنه ليس في الواقع أصلًا لقائمة السياق.

إذا نظرت إلى لوحة تصحيح الأخطاء في Visual Studio، فيجب أن ترى بعض التحذيرات حول تعبير الربط الفاشل.هل أنت؟

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