سؤال

<اقتباس فقرة>   

<قوية> ملاحظة لقد طرح السؤال ذات الصلة: كيفية الجمع بين DataTrigger وEventTrigger؟

ولدي مربع قائمة تحتوي على عدة عناصر. فئة العنصر تنفذ INotifyPropertyChanged ولها IsAvailable الممتلكات. يمكنني استخدام تلك الخاصية للإشارة إلى خيارات غير متوفرة في القائمة باستخدام لون مختلف.

ولكن، إذا كان العنصر المحدد غير متوفر، ثم اللون المقدمة يجب أن تكون حمراء.

<ListBox>
  <ListBox.Resources>
    <DataTemplate DataType="{x:Type local:InstitutionViewModel}">
      <TextBlock Name="Name" Text="{Binding Name}"/>
      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsAvailable}" Value="False">
          <Setter TargetName="Name" Property="Foreground" Value="#888"/>
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </ListBox.Resources>
</ListBox>

ويمكنني استخدام الزناد البيانات الواردة أعلاه إلى الرمادي من العناصر غير متوفرة.

والمشكلة أواجه هو أن حقيقة أن يتم تحديد العنصر له علاقة مع البيانات الأساسية التي لا بد من القالب شيئا. ما أريد حقا هو نوع من أنواع متعددة الزناد الذي يدعم كلا من Trigger العادية على الممتلكات التبعية (ListBoxItem.IsSelected) جنبا إلى جنب مع DataTrigger على عنصر البيانات منضم.

ويمكن أن يتم ذلك دون إدخال مفهوم التحديد إلى نموذج بلدي الرأي؟

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

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

المحلول

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

وهنا هو ما فعلته:

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding
      RelativeSource={
        RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
        Path=IsSelected}" Value="True"/>
    <Condition Binding="{Binding IsAvailable}" Value="False"/>
  </MultiDataTrigger.Conditions>
  <Setter TargetName="Name" Property="Foreground" Value="#F00"/>
</MultiDataTrigger>

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

<DataTrigger Binding="{Binding 
  RelativeSource={
    RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
    Path=IsSelected}" Value="True">
  <Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>

نصائح أخرى

لاستخدامه مع تغيير DataGridRow وضع ملزمة لSelf:

Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=... 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top