سؤال

لاحظت ذلك عدة مرات عند استخدام القوائم مع الأوامر ، فهي ليست ديناميكية للغاية ، تحقق من ذلك. أقوم بإنشاء قائمة من مجموعة من الألوان ، أستخدمها لتلوين عمود في بيانات البيانات. على أي حال ، عندما أقوم أولاً بإظهار القائمة (قائمة سياق) ، يحدث ربط معلمة الأمر ويرتبط بالعمود الذي تم فتح قائمة السياق. ومع ذلك ، في المرة القادمة التي أحضرها ، يبدو أن WPF يخبئ القائمة ولا يعيد إعادة ربط معلمة الأمر. حتى أتمكن من ضبط اللون فقط على العمود الأولي الذي ظهرت عليه قائمة السياق.

لقد تجولت في هذا الموقف في الماضي من خلال جعل القائمة ديناميكية تمامًا وتدمير المجموعة عندما تغلق القائمة وإجبار إعادة البناء في المرة القادمة التي فتحت فيها ، لا أحب هذا الاختراق. أي شخص لديه طريقة أفضل؟

    <MenuItem
       Header="Colour"
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ResultEditorGrid}}, Path=ColumnColourCollection}"
       ItemTemplate="{StaticResource colourHeader}" >
       <MenuItem.Icon>
          <Image
             Source="{StaticResource ColumnShowIcon16}" />
       </MenuItem.Icon>
       <MenuItem.ItemContainerStyle>
          <Style
             TargetType="MenuItem"
             BasedOn="{StaticResource systemMenuItemStyle}">
             <!--Warning dont change the order of the following two setters
                                otherwise the command parameter gets set after the command fires,
                                not mush use eh?-->
             <Setter
                Property="CommandParameter">
                <Setter.Value>
                   <MultiBinding>
                      <MultiBinding.Converter>
                         <local:ColumnAndColourMultiConverter/>
                      </MultiBinding.Converter>
                      <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGridColumnHeader}}" Path="Column"/>
                      <Binding Path="."/>
                   </MultiBinding>
                </Setter.Value>
             </Setter>
             <Setter
                Property="Command"
                Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ResultEditorGrid}}, Path=ColourColumnCommand}" />
          </Style>
       </MenuItem.ItemContainerStyle>
    </MenuItem>
هل كانت مفيدة؟

المحلول

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

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

تقوم بشكل أساسي بإنشاء هذا الجسر الذي يرتبط بنص DataContext الخاص بالمنظر. تم إنشاء الجسر كمورد ثابت, ، السماح لك بالربط بها من قائمة السياق حتى لو كانت خارج الشجرة المرئية.

أضف هذا إلى xaml الخاص بك:

<Window.Resources>
   <!-- This is the "root node" in the virtual branch
   attached to the logical tree. It has its
   DataContext set by the Binding applied to the
   Window's DataContext property. -->
   <FrameworkElement x:Key="DataContextBridge" />
</Window.Resources>

<Window.DataContext>
   <!-- This Binding sets the DataContext on the "root node"
   of the virtual logical tree branch.  This Binding
   must be applied to the DataContext of the element
   which is actually assigned the data context value. -->
   <Binding
    Mode="OneWayToSource"
    Path="DataContext"
    Source="{StaticResource DataContextBridge}"
   />
</Window.DataContext>

هذا هو الجسر الذي تحدثت عنه. يستغرق DataContext و __pushes It_ إلى Bridges DataContext ، وهو (كما قلت من قبل) مورد ثابت.

ثم يمكنك ببساطة هذا إلى datacontext من ContextMenu:

 DataContext="{Binding
               Source={StaticResource DataContextBridge},
               Path=DataContext}"

الآن قم بإلقاء جميع المسار النسبي وما إلى ذلك واستخدم الربط المنتظم داخل عناصر القائمة ، ويجب أن تكون على ما يرام. سيتم تحديث DataContext كالمعتاد.

ملاحظة واحدة فقط:

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

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