WPF - كيفية الجمع بين DataTrigger والزناد؟
-
03-07-2019 - |
سؤال
<قوية> ملاحظة لقد طرح السؤال ذات الصلة: كيفية الجمع بين 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=...