2017-05-17 3 views
0

XAML의 바인딩에 다시 문제가 있습니다. 직접 해결할 수 없습니다. 나는 ListViewComboBox을 가지고있다. ListViewItemsSourceTabControl의보기 모델에 있으며 ComboBox.ItemsSource도 있습니다. 이 컬렉션에 ComboBox을 바인딩하려면 어떻게해야합니까? 여기 Tab의 속성에서 ListView의 ComboBox 바인딩

내 코드는 지금까지 있습니다 :

public ObservableCollection<TypeViewModel> ComboBoxSource { get; set; } 
public ObservableCollection<CostViewModel> ListViewSource { get; set; } 

가이 속성에 CombBox.ItemsSource을 결합 할 수 있습니다 : 여기

<ListView ItemsSource="{Binding ListViewSource}" SelectedItem="{Binding ListViewSelection}" 
      ItemTemplate="{DynamicResource ListViewTemplate}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="..."> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding ComboBoxSource}" 
            SelectedValue="{Binding ...}" 
            DisplayMemberPath="DisplayName"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> // ... 

그리고 TabViewModel에서 ItemsSource 속성의 단지 머리는?

+3

바인딩의 window에 이름을 부여하십시오 :'ItemsSource = " {DataContext.ComboBoxSource 바인딩, RelativeSource = {RelativeSource AncestorType = ListView}} ". –

+2

상대 소스는 이전 댓글에 따라 원하는대로 할 수 있습니다. 불행히도, 당신의 질문은 왜'ListView'의 모든 아이템이 같은 드롭 다운을 가지는지 분명하지 않지만 어떤 이유로 상대 소스 접근법이 당신의 요구에 맞지 않는다면 각각의 TypeViewModel에 대해 비합리적이지는 않을 것입니다 '부모보기 모델 (예 :'ComboBoxSource {get {return _parentViewModel.ComboBoxSource;}}')에 위임하는 자체 'ComboBoxSource' 속성을 노출 시키거나 또는 이러한 값의 출처에 따라 어쩌면 싱글 톤이 될 수도 있습니다. –

+0

답장을 보내 주셔서 감사합니다. 불행히도이 방법은 저에게는 효과가 없지만, KMCho가 대답에서 설명했던 방법대로 해결했습니다. {Element ElementName = ControlName, Path = DataContext.ComboBoxSource } – stl

답변

0

단지 하나의 예입니다. 이 경우 TabViewModel이 표시됩니다.

public class TabViewModel 
{ 
    public ObservableCollection<CostViewModel> ListViewSource { get; set; } 
    public ObservableCollection<TypeViewModel> ComboBoxSource { get; set; } 

    public TabViewModel() 
    { 
     ListViewSource = new ObservableCollection<CostViewModel>(); 
     ListViewSource.Add(new CostViewModel() { CostA = "A", CostB = "B" }); 
     ListViewSource.Add(new CostViewModel() { CostA = "1", CostB = "2" });    

     ComboBoxSource = new ObservableCollection<TypeViewModel>(); 
     ComboBoxSource.Add(new TypeViewModel() { TypeA = "A1", TypeB = "B1" }); 
     ComboBoxSource.Add(new TypeViewModel() { TypeA = "A2", TypeB = "B2" }); 
    } 
} 

및 넣어 DataContextwindow

TabViewModel vm { get; set; }   
public Window1() 
{ 
    vm = new TabViewModel(); 
    this.DataContext = vm;    
    InitializeComponent(); 
} 

과 추측에의 CellTemplate에서 ElementName

<Window x:Class="WpfApplication5.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300" Name="mainWnd">  
    <Grid>   
     <ListView ItemsSource="{Binding ListViewSource}" > 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="..."> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox ItemsSource="{Binding ElementName=mainWnd, Path=DataContext.ComboBoxSource}" DisplayMemberPath="TypeA"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView>   
    </Grid> 
</Window> 
+0

위대한 예를 들어 주셔서 대단히 감사합니다! 이것이 내 문제를 해결했습니다. – stl