SORU
4 AĞUSTOS 2010, ÇARŞAMBA


Erişim üst DataTemplate gelen DataContext

Çocuk koleksiyonu bağlar ListBox bir ViewModel üzerinde var. Liste kutusu öğeleri üst ViewModel: bir özelliği dayalı bir datatemplate tarz

<Style x:Key="curveSpeedNonConstantParameterCell">
   <Style.Triggers>
      <DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified, 
          ElementName=someParentElementWithReferenceToRootDataContext}" 
          Value="True">
          <Setter Property="Control.Visibility" Value="Hidden"></Setter>
      </DataTrigger>
   </Style.Triggers>
</Style>

Çıkış aşağıdaki hatayı alıyorum:

System.Windows.Data Error: 39 : BindingExpression path error: 
 'CurveSpeedMustBeSpecified' property not found on 
   'object' ''BindingListCollectionView' (HashCode=20467555)'. 
 BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified; 
 DataItem='Grid' (Name='nonConstantCurveParametersGrid');
 target element is 'TextBox' (Name=''); 
 target property is 'NoTarget' (type 'Object')

Eğer öyleyse bağlayıcı ifade 7 ** değiştirirsem çalışır, ama sadece sürece üst kullanıcının datacontext olarak kontrol BindingListCollectionView. Bu kullanıcı denetimi geri kalanı BindingList otomatik CurrentItem özelliklerini bağlar için de kabul edilebilir değildir.

Nasıl olursa olsun, üst veri içerik koleksiyonu görüntülemek veya tek bir öğe çalıştığı stili içinde bağlayıcı ifade belirtebilir miyim?

CEVAP
23 AĞUSTOS 2010, PAZARTESİ


Silverlight göreli kaynağı ile ilgili sorunlar vardı. Arama ve okuduktan sonra bazı ek Bağlayıcı kütüphane kullanmadan uygun bir çözüm bulamadım. Ama, işteüst DataContext erişim sağlamasını için başka bir yaklaşımdoğrudan veri içeriği biliyorsun unsuru başvurarak. Binding ElementName kullanır ve oldukça iyi, kendi adlandırma saygı ve bileşenlerinde şablonları/stil ağır yeniden yok sürece çalışır:

<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Content={Binding MyLevel2Property}
              Command={Binding ElementName=level1Lister,
                       Path=DataContext.MyLevel1Command}
              CommandParameter={Binding MyLevel2Property}>
      </Button>
    <DataTemplate>
  <ItemsControl.ItemTemplate>
</ItemsControl>

Bu da eğer 13*/Template*içine düğme koyarsanız çalışır:

<Border.Resources>
  <Style x:Key="buttonStyle" TargetType="Button">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="Button">
          <Button Command={Binding ElementName=level1Lister,
                                   Path=DataContext.MyLevel1Command}
                  CommandParameter={Binding MyLevel2Property}>
               <ContentPresenter/>
          </Button>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Border.Resources>

<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Button Content="{Binding MyLevel2Property}" 
              Style="{StaticResource buttonStyle}"/>
    <DataTemplate>
  <ItemsControl.ItemTemplate>
</ItemsControl>

İlk başta ana unsurları x:Names şablonu esas alan bir maddenin içinden erişilebilir değil, ama daha iyi bir çözüm buldum, ben de denedim bunu düşündüm, ve gayet iyi çalışıyor.

Bu çözüm yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • MkElite

    MkElite

    13 NİSAN 2012
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008