2016-03-31 6 views
0

Görünüm modelimde (kullanıcı veri içeriğini denetler) gözlemlenebilir bir koleksiyona bağlanan bir liste kutusu var.DataTemplate içindeki bir düğmenin komutunu, ana öğenin veri içeriğine nasıl ayarlayabilirim

<Button Command="{Binding SimpleMethod}"/> 

Her şey gayet:

DeviceDetector driveDetector; 
public DriveSelector() 
{ 
    InitializeComponent(); 

    driveDetector = DeviceDetector.Instance; 
    DataContext = driveDetector; 
} 

Bu benim liste

<ListBox Style="{StaticResource ListBoxStyle}" ItemsSource="{Binding DriveCollection}"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <Button Width="70" Style="{StaticResource DriveButtonStyle}" Command="{Binding SimpleMethod}"> 
           <StackPanel> 
            <Image Source="{Binding Image}" Style="{StaticResource DriveImageStyle}"/> 
            <Label Content="{Binding Name}" Style="{StaticResource DriveLabelStyle}"/> 
           </StackPanel> 
          </Button> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
Ben iCommand uygulayan

ve ben şöyle liste dışında komuta bağlanan zaman benim kodudur.

System.Windows.Data Error: 40 : BindingExpression path error: 'SimpleMethod' property not found on 'object' ''DriveInfo' (HashCode=6377350)'. BindingExpression:Path=SimpleMethod; DataItem='DriveInfo' (HashCode=6377350); target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand')

Ben düğmeye datacontext modeli ve böylece yönteme olduğunu görebilirsiniz 'SimpleMethod' bulunamıyor i düğmenin listbox en datatemplate içeriye komutu bağlamak için denemek Ancak bu hatası olsun . Komutu, liste kutusunun kendisinde bulunan veri konteynerine bağlayabilmemin bir yolu var mı?

+0

Düğmeniz için özel bir davranış yazabilirsiniz. Bu şekilde düğmeye basacaksınız. Bilmiyorum, bu yöntem ne zaman kovulmalı? –

cevap

1
Böyle pencere veya sayfa üst düzey DataContext'i başvurabilir

: benim sorunu çözmek için yönetilen nasıl

<Button Content="{StaticResource Whatever}" 
     DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Page}}" 
     CommandParameter="{Binding}" 
     Command="{Binding SimpleMethod}" /> 
+0

'ListBox'' 'DataContext''ünü almak yeterli. Ayrıca, bağlandığınızda Path = SimpleCommand'ı unuttun. Bu, imho'dan sonra kabul edilen bir cevap olmalı. Küçük not: ya 'CommandParameter'ı kaldır (OP'ye gerek yok) ya da **' Command' önce ** 'ye geçin (bkz. [Here] (http://stackoverflow.com/a/336258/1997232) neden önemli). – Sinatr

+0

@Sinatr, bahşiş için teşekkürler. Ama ben bu kodu aldığım komutumda 'Path' kullanmıyorum ve gayet iyi çalışıyor. – Crowcoder

+0

Bazı garip nedenlerden ötürü haklısınız (önceki yorumum için özür dilerim). ”DataContext” i yeniden atadığınızı görmedim. Bunu yapma. 'Komut' kendi içinde 'Bağıl Kaynak' yerine kendi kendine bağlanma: 'Komut =" {Binding DataContext.SimpleMethod, RelativeSource = {RelativeSource FindAncestor, AncestorType = ListBox}} ". – Sinatr

0

:

Öncelikle ben bir statik kaynak oluşturduktan benim modeli görüntüleyin. Öyleyse sonra şöyle (statik kaynak) görünümü modeline komuta kaynağını değiştirmeye izin

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Styles;component/Resources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <vm:DeviceSelectorViewModel x:Key="myViewModel" x:Name="myVM" /> 
    </ResourceDictionary> 
</UserControl.Resources> 

<UserControl.DataContext> 
    <StaticResourceExtension ResourceKey="myViewModel"/> 
</UserControl.DataContext> 

xaml

benim datacontext bunu bağlı: Cevaplar için

<Button Width="70" Style="{StaticResource DriveButtonStyle}" Command="{Binding SimpleCommand, Source={StaticResource myViewModel}}" > 

Teşekkür!