2016-04-01 24 views
1

Bir Control'ü ComandParamter olarak göndermeye çalışıyorum, böylece odağı ayarlayabilirim. Bu denetimler bir GridViewColumn HeaderTemplate içinde ve sekme, anlayabildiğim kadarıyla başlıkları geçemez. Araştırmam, ElementName adının nedeni nedeniyle x:reference kullanmamı sağladı. Komut düzgün bir şekilde bağlı, bir CommandParameter bağlamadığımda çalışır.KeyBinding'de CommandParameter olarak Bind Denetimi

Attempt to reference named object(s) 'resourcetypeSrch' which have not yet been defined. Forward references, or references to objects that contain forward references, are not supported on directives other than Key.

nasıl TextBox keybinding CommandParameter için x:Name resourcetypeSrch ile ComboBox bağlayabilir: Aşağıdaki xaml bu bağlanma ile

, bu hatayı alıyorsunuz? o tip ComboBox kontrolünü bulana kadar

<KeyBinding Key="Tab" 
     Command="{Binding DataContext.SearchNavigationCmd, RelativeSource={RelativeSource AncestorType=Page}}" 
     CommandParameter="{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}}"/> 

Bu kod kontrolleri ağaca görünecektir:

<GridViewColumn DisplayMemberBinding="{Binding Name }"> 
    <GridViewColumn.HeaderTemplate> 
     <DataTemplate> 
      <DockPanel> 
       <TextBlock Text="{StaticResource Name}" /> 
       <TextBox Text="{Binding DataContext.Foo, RelativeSource={RelativeSource AncestorType=Page}}"            
         Style="{StaticResource SearchBox }" Width="200"> 
        <TextBox.InputBindings> 
         <KeyBinding Key="Tab" 
            Command="{Binding DataContext.SearchNavigationCmd, RelativeSource={RelativeSource AncestorType=Page}}" 
            CommandParameter="{Binding {x:Reference resourcetypeSrch}}"/> 
        </TextBox.InputBindings> 

       </TextBox> 
      </DockPanel> 
     </DataTemplate> 
    </GridViewColumn.HeaderTemplate> 
</GridViewColumn> 

<GridViewColumn Width="350" DisplayMemberBinding="{Binding ResourceTypeLookup.TypeName }"> 
    <GridViewColumn.HeaderTemplate> 
     <DataTemplate> 
      <DockPanel> 
       <TextBlock Text="{StaticResource ResourceType}" /> 
       <ComboBox x:Name="resourcetypeSrch" Width="300" HorizontalAlignment="Left" IsSynchronizedWithCurrentItem="True" 
         ItemsSource="{Binding DataContext.SrchResourceTypeLookups, RelativeSource={RelativeSource AncestorType=Page}, Mode=OneTime}" 
         DisplayMemberPath="TypeName" 
         SelectedValuePath="Bar" 
         SelectedValue="{Binding DataContext.Fizz, RelativeSource={RelativeSource AncestorType=Page}}" > 
       </ComboBox> 
      </DockPanel> 
     </DataTemplate> 
    </GridViewColumn.HeaderTemplate> 
</GridViewColumn> 
+0

''? – StepUp

cevap

0

Başka bir olasılık hakkında düşündüm. Görsel ağacı yalnızca komut işleyici yönteminde hareket ettirebilir ve denetiminizi isme göre bulabilirsiniz.

FindChild<ComboBox>(ListView, "resourcetypeSrch") 

Substitute ":

public static T FindChild<T>(DependencyObject parent, string childName) 
    where T : DependencyObject 
{  
    // Confirm parent and childName are valid. 
    if (parent == null) return null; 

    T foundChild = null; 

    int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < childrenCount; i++) 
    { 
    var child = VisualTreeHelper.GetChild(parent, i); 
    // If the child is not of the request child type child 
    T childType = child as T; 
    if (childType == null) 
    { 
     // recursively drill down the tree 
     foundChild = FindChild<T>(child, childName); 

     // If the child is found, break so we do not overwrite the found child. 
     if (foundChild != null) break; 
    } 
    else if (!string.IsNullOrEmpty(childName)) 
    { 
     var frameworkElement = child as FrameworkElement; 
     // If the child's name is set for search 
     if (frameworkElement != null && frameworkElement.Name == childName) 
     { 
     // if the child's name is of the request name 
     foundChild = (T)child; 
     break; 
     } 
    } 
    else 
    { 
     // child element found. 
     foundChild = (T)child; 
     break; 
    } 
    } 

    return foundChild; 
} 

Yani komuta sadece yapmanız gereken: Burada bir nesnenin VisualTree geçer ve belirtilen yöntemle bir kontrol için görünen bir yöntemin güzel bir uygulamasıdır ListView "baktığınız verilere ebeveynlik herhangi bir kontrolün adı ile.

+0

Teşekkür ederim, bu çalışır, ancak her komut için bir Komut sahip olmamı gerektiriyor, çünkü hem KomutParametresi'nde hem kontrol adını hem de ana Bağımlılık Nesnesini geçmenin bir yolu yok. Sanırım arama alanlarını sütun başlıklarından çıkaracağım ve tüm sorunlarımı kurtaracağım. – Crowcoder

0

Sen keybinding da CommandParameter için bağlayıcı RelativeSource kullanmak gerekir. Özel durumunuzda, bulacağınız ilk ComboBox, ihtiyacınız olan şey olacak.

+0

Bunu bir deneyeceğim ama pozisyona güvenme fikrini sevmiyorum. Aynı şekilde çalışmam gerekecek başka sütun başlığı kontrollerim var. – Crowcoder

+0

Yeterli ücret. Dilerseniz denetiminize isim verebilirsiniz: CommandParameter = "{Binding ElementName = resourcetypeSrch}" –

+0

'ElementName' denediğim ilk şey. 'CommandParameter', neyse, 'x: reference' denemeye geldiğim şekilde geliyor. – Crowcoder

0

Kılavuzun üstbilgisindeki denetimler arasında gezinmek için sekme yapabilmek istediğinizi düşünüyorum. Bunu başarmak için yapabileceğiniz şey, her bir sütun için dataSource öğesinde bir özellik oluşturur (örn. Column1IsFocused, Column2IsFocused).

Ardından, kontrolünüzü (örneğin, here is one) viewmodel'den odaklamak için bir uzantı oluşturabilirsiniz. Uzantınızın IsFocused özelliğini dataSource'dan her bir özelliğe bağlarsınız ve daha sonra Komut işleyicisinde bir veya diğer özelliği true olarak ayarlarsınız. Bunun işe yarayabileceğine inanıyorum.