2015-04-03 100 views
1

我有WPF中的數據綁定幾個問題。WPF:綁定兩個不同的列表

我有一個列表框,它綁定到一個BindingList。

<ListBox x:Name="SampleListBox" ItemsSource="{Binding List1}" ItemContainerStyle="{StaticResource ListBoxStyle}" BorderThickness="0" SelectedIndex="0" Margin="0"> 
      <ListBox.ItemTemplate> 
       <DataTemplate > 
        <Border x:Name="border" Width="185"> 
         <TextBlock Text="{Binding name}"/> 
        </Border> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

直到這裏,一切工作正常。現在我有一個DataGrid應該鏈接到另一個BindingList並顯示它的一些字符串。例如,如果選擇了ListBox的第一項,則網格應該顯示第二個列表的第一項的數據。 我知道,如果ListBox和Grid都從同一列表中獲取數據,它將如何工作,但我不知道該怎麼辦,如果這不可能,並且有兩個不同的列表。

回答

0

您可以將ListBox控件的SelectedIndex綁定到ViewModel中Int(Property1)類型的屬性。

也雙向將DataGrid中的SelectedItem綁定到第二個列表類型的另一個屬性(Property2)。

在Property1的設置器中,將Property2更改爲Property1的索引處的項目 - 即List2 [Property1]。它應該更改DataGrid中的選定項目。

0

所以,你想使用列表框,基本上,在網格上設置一個過濾器?

請注意,下面的LBItem和ViewModel需要實現INotifyPropertyChanged並在屬性更改時觸發它們的PropertyChanged事件,否則這些事件都不起作用。但爲了清晰起見,我遺漏了樣板。

很多方法可以做到這一點。

C#

public class LBItem { 
    public ViewModel Parent { get; set; } 
    public IEnumerable<String> SubItems { 
     get { 
      return Parent.List2.Where(/* filter items here */); 
     } 
    } 
} 

public class ViewModel { 
    // 
    public ObservableCollection<LBItem> LBItems { get; set; } 
    public LBItem SelectedLBItem { get; set; } 
    public List<String> List2 { get; set; } 
} 

XAML

<ListBox 
    Name="MasterLB" 
    ItemsSource="{Binding LBItems}" 
    SelectedItem={Binding SelectedLBItem}" 
    /> 

<DataGrid 
    ItemsSource="{Binding ElementName=MasterLB, Path=SelectedItem.SubItems}" 
    /> 

,將工作,你是否綁定MasterLB.SelectedItem對視圖模型的屬性。但只要你有約束力MasterLB.SelectedItem,你可以很容易地結合DataGrid.ItemsSourceSelectedLBItem.SubItems在視圖模型,就像這樣:

<DataGrid 
    ItemsSource="{Binding Path=SelectedLBItem.SubItems}" 
    /> 

但綁定的ElementName是得心應手了很多東西,所以我給你都。

你也可以做這樣的事情:

C#

public class LBItem { 
    public IEnumerable<String> Filter(IEnumerable<String> fullList) { 
     return fullList.Where(/* filter items here */); 
    } 
} 

public class ViewModel { 
    public ObservableCollection<LBItem> LBItems { get; set; } 
    private LBItem _selectedItem; 
    public LBItem SelectedLBItem { 
     get { return _selectedItem; } 
     set { 
      _selectedItem = value; 
      List2Filtered = (null == _selectedItem) 
       ? new List<String>() 
       : _selectedItem.Filter(List2).ToList(); 
     } 
    } 
    public List<String> List2 { get; set; } 
    public List<String> List2Filtered { get; set; } 
} 

XAML

<ListBox 
    Name="MasterLB" 
    ItemsSource="{Binding LBItems}" 
    SelectedItem={Binding SelectedLBItem}" 
    /> 

<DataGrid 
    ItemsSource="{Binding List2Filtered}" 
    />