2011-04-21 2 views
3

2 열 4 행 응용 프로그램에서 DataGrid가 있습니다. 각 셀은 WPF Toolkit 자동 완성 상자 컨트롤이어야합니다. MVVM 패턴을 사용하여 모든 것을 구현하고 싶습니다. 이 텍스트 상자 세포를 채우기 위해 쉽게 :자동 완성 상자를 DataGrid에 어떻게 추가합니까?

<DataGrid ItemsSource="{Binding viewModel, Path=Fields}" AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro"> 
      <DataGrid.Columns>      
       <DataGridTextColumn Header="Predicate" Binding="{Binding Key}"/>     
       <DataGridTextColumn Header="Value" Binding="{Binding Value}"/> 
      </DataGrid.Columns> 
</DataGrid> 

그러나 어떤 이유로 작동하지 않습니다 자동 완성 상자와 동일한 작업을 수행하려고합니다. 그것은 컴파일하고 실행하지만 입력시 자동 완성 상자가 열리지 않습니다. 내가 사용 : 바인딩 된 속성에 대한

<DataGrid ItemsSource="{Binding viewModel, Path=Fields}" AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Pre"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <wpfToolkit:AutoCompleteBox ItemsSource="{Binding viewModel, Path=AvailableFields}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
</DataGrid> 

정의는 다음과 같습니다

public IEnumerable<KeyValuePair<string, string>> Fields 
public IEnumerable<string> AvailableFields 

어떤 아이디어?

업데이트 : 다음은 @Damascus 응답을 기반으로 한 전체 XAML입니다. 어떤 이유로 든 작동하지 않습니다.

<UserControl x:Class="IKB.Views.IKBInputView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:vm="clr-namespace:IKB.ViewModels" 
      xmlns:wpfToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <vm:IKBInputVM x:Key="viewModel" /> 
    </UserControl.Resources> 
    <StackPanel Orientation="Vertical">   
     <DataGrid ItemsSource="{Binding viewModel, Path=Fields}" AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Pre"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <wpfToolkit:AutoCompleteBox ItemsSource="{Binding DataContext.viewModel.AvailableFields, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </StackPanel> 
</UserControl> 
+1

(지금으로 볼 것이다 작업중인 하나 인 UserControl의 DataContext에) XAML이 작동하려면'AvailableFields'는'Fields'의 자식이어야하고,'Key' 및'Value'와 마찬가지로 TextBox 예제의 경우'Fields'의 자식입니다. – publicgk

+0

그래서 자동 완성을위한 ItemsSource가 Fields의 자식이 아니게 만들 수 있습니까? – dulli

답변

1

여기에는 동일한 DataContext이 없기 때문입니다.

AutoCompleteBox은 정확한 위치는 모르지만 현재 셀 자체와 관련되어 있으므로 잘못된 위치에서 ItemsSource를 찾습니다.

Binding은 원본 DataContext를 참조해야합니다. 이 데이터 그리드는 UserControl을에 있다고 가정하면, 시도 :

<wpfToolkit:AutoCompleteBox ItemsSource="{Binding DataContext.viewModel.AvailableFields, 
      RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} /> 

이 트릭을 할해야이를 위해

+0

어떤 이유로 작동하지 않았습니다. XAML은 주석에 적합하지 않으므로 질문에 편집으로 첨부 할 것입니다. – dulli

+1

제대로 작동합니다. 그것은 '이어야합니다. 감사! – dulli

관련 문제