2010-11-28 15 views
6

Penceremde, her biri Izgara Denetimi içeren birkaç GroupBox Denetimi vardır. Bu Izgaralara bir Tarz atamak istiyorum. Ancak, sadece bir GroupBox'ta bulunan bu Izgaralar için, tüm diğer Izgaralar etkilenmemelidir.Stil DataTrigger Ana denetimin türüne başvurusu

Aşağıdakileri denedim, hangi GetType() özellik olarak çalışmaz.

<Style TargetType="Grid"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.GetType()}" Value="{x:Type GroupBox}"> 
       <!-- <Setter Property="..." Value="..."/> --> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Ben geçici bir çözüm bulduk ama GroupBoxes değiştirmek zorunda gibi, gerçekten güzel bir çözüm değil: Açıkçası

<Style TargetType="GroupBox"> 
     <Setter Property="Tag" Value="blub"/> 
    </Style> 
    <Style TargetType="Grid"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub"> 
       <!-- <Setter Property="..." Value="..."/> --> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

elle her Grid stili ayarlamak olabilir, ama ben Bundan kaçınmaya çalışıyorum, çünkü bunların birçoğu var. Umarım ilk örnek çalışmayı yapmanın bir yolunu bulabilirsin. Mod tipi, bir numaralandırma olan aslında BindingMode olduğu ve hiçbiri üyesi Self çünkü

cevap

5
<DataTrigger Binding="{Binding Path=Parent.Tag, RelativeSource={RelativeSource Mode=Self}}" Value="blub"> 

Bu kod, işe yaramaz. Yani bu ödev Mode = Self kodunuzda yanlıştır. Modun olası değerlerini bilmek, click this.

şudur doğru yazmanın yolu,

<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="blub"> 

Ve tabii

, bunun işe yaraması için, zaten yazdım GroupBox için o Stil tutmak ettik.

+0

Korkarım ki bu konuda yanılıyorsunuz. Kodum iyi çalışıyor. Mod, BindingMode türünde değil, RelativeSourceMode türünde değildir. Benim tahminim RelativeSource = {RelativeSource Mode = Self} 'daki kuşakları gözden kaçırmış olmanızdır, bu da Mode'u RelativeSource özelliği ve Bağlama özelliklerinden biri değildir. – PeterE

+0

@Peter: Haklısınız. Bu yatay kaydırma beni rahatsız etti ve 'Mode' özelliğini RelativeSource yapan iç parantezleri gerçekten fark etmedim. Hataya dikkat ettiğiniz için teşekkürler! :-) – Nawaz

0

kullanın aşağıdaki kodu:

using DevExpress.Xpf.Core.Native; 
using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 

namespace BindingErrorHelper 
{ 
    public class IsTypeFoundConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      FrameworkElement element = value as FrameworkElement; 
      Type type = parameter as Type; 
      if (element != null && type != null) 
      { 
       element = LayoutHelper.FindElement(element,type); 
       if (element != null) 
        return true; 
      } 
      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value; 
     } 
    } 

    public class LayoutHelper 
    { 
     public static FrameworkElement FindElement(FrameworkElement treeRoot, Type type) 
     { 
     FrameworkElement parentElement = VisualTreeHelper.GetParent(treeRoot) as FrameworkElement; 
     while (parentElement != null) 
     { 
      if (parentElement.GetType() == type) 
       return parentElement; 
      else 
       parentElement = VisualTreeHelper.GetParent(parentElement) as FrameworkElement; 
     } 
     return null; 
     } 
    } 
} 

olarak XAML kod yazın: Bu benim için çalıştı

<tt:IsTypeFoundConverter x:Key="isTypeFoundConverter"/> 

<Style TargetType="Grid"> 
    <Style.Triggers> 
     <DataTrigger Binding={Binding RelativeSource={RelativeSource Self}, Converter={StaticResource isTypeFoundConverter}, ConverterParameter={x:Type GroupBox}}" Value="true"> 
      <!-- <Setter Property="..." Value="..."/> --> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
1

:

 <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StatusBar}}, Path=DependencyObjectType.Name}" Value="StatusBar"> 
       <Setter Property="Margin" Value="0"/> 
       <Setter Property="Padding" Value="0"/> 
       <Setter Property="Background" Value="Chartreuse"/> 
      </DataTrigger> 
     </Style.Triggers> 

Bu ana türüne göre stilini ayarlamanızı sağlar Tag'e başvurmak zorunda kalmadan, gerçekten işaretlemeden ziyade kod tarafından kullanılması gerekir.

+0

Bu umut verici görünüyor. İlginç buluyorum, (CLR) türü yalnızca GetType() yöntemiyle kullanılabilir, ancak AFAIK temel olarak CLR türü etrafında bir sarıcı olan DependencyObjectType ise bir özelliktir. – PeterE

+0

Evet, ben de ilginç buldum. Ayrıca GetType'un neden bir özellik yerine bir yöntem olduğunu araştırıyordum. Verimlilik, kötüye kullanma, mülk sahibinin yapması gerekenler hakkında sözleşmeler, vb. Gibi çeşitli görüşler vardır. – bigbyte

+0

ATM Test etmek için uygunluğum yok. Aşağıdaki tetikleyici tanımlarının eşdeğer olup olmadığını söyleyebilir misiniz? (Benimki bile işe yarıyor mu?) Orijinal fikrim: '' Sürümünüzü: ' PeterE

İlgili konular