2014-09-24 133 views
0

我已經創建了一個從ListBox派生的自定義控件,並且我有問題將「SelectedItemsList」綁定到它在視圖模型中的相應屬性。多選擇列表框綁定問題

問題:列表框中的所選項目不會將其放入視圖模型中綁定的屬性中。列表框允許多個選擇,但這些都不會進入視圖模型中的列表。

MultiSelectListBox:

public class MultiSelectListBox : ListBox 
{ 
    public MultiSelectListBox() { } 

    public static readonly DependencyProperty SelectedItemsListProperty = 
     DependencyProperty.Register(
      "SelectedItemsList", 
      typeof(IList), 
      typeof(MultiSelectListBox), 
      new PropertyMetadata(default(IList))); 
    public IList SelectedItemsList 
    { 
     get { return (IList) GetValue(SelectedItemsListProperty); } 
     set { SetValue(SelectedItemsListProperty, value); } 
    } 
} 

聲明中MainWindow.xaml:

<local:MultiSelectListBox 
    DataContext="{StaticResource viewModel}" 
    DockPanel.Dock="Left" 
    Visibility="{Binding IsThailandFinal, Converter={StaticResource BoolToVisConverter}, FallbackValue=Visible}" 
    ItemsSource="{Binding SelectedOutputtapeList}" 
    SelectionMode="Multiple" 
    SelectedItemsList="{Binding SelectedOutputTapes, Mode=TwoWay}" 
    HorizontalAlignment="Right" 
    Background="DeepSkyBlue" 
    Foreground="MidnightBlue" 
    ScrollViewer.VerticalScrollBarVisibility="Visible" 
    Height="100" 
    Width="70" 
    Margin="5"/> 

視圖模型(簡體):

public class BTLogFrontEndViewModel : ViewModelBase 
{ 
    private List<string> selectedOutputTapes; 
    public BTLogFrontEndViewModel() 
    { 
     selectedOutputTapes = new List<string>(); 
    } 
    public List<string> SelectedOutputTapes 
    { 
     get 
     { 
      return selectedOutputTapes; 
     } 
     set 
     { 
      selectedOutputTapes = value; 
      OnPropertyChanged("SelectedOutputTapes"); 
     } 
    } 
} 
+0

您的ObservableCollection的郵政編碼是否在Visual Studio的輸出窗口中顯示任何綁定錯誤? – 2014-09-24 12:56:53

+0

ObservableCollection是一個.NET集合,無需顯示代碼。 – kformeck 2014-09-24 13:19:01

+0

我的意思是'SelectedOutputTapes'的聲明,而不是ObservableCollection的源代碼。另外,「我有問題」是什麼意思?關於問題陳述你能更精確嗎? – 2014-09-24 13:23:07

回答

0

一種方法是不使用自定義列表框和使用列表中的對象擴展INotifyPropertyChanged:

<ListBox 
    Width="70" 
    Height="100" 
    HorizontalAlignment="Right" 
    Margin="5" 
    Background="DeepSkyBlue" 
    DockPanel.Dock="Left" 
    Foreground="MidnightBlue" 
    ItemsSource="{Binding SelectedOutputtapeList}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible" 
    SelectionMode="Multiple" 
    DisplayMemberPath="Description" 
    Visibility="{Binding IsThailandFinal, Converter={StaticResource BoolToVisConverter}, FallbackValue=Visible}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

假設BTLogFrontEndViewModel是你的DataContext:

public class BTLogFrontEndViewModel : ViewModelBase 
{ 
    private ObservableCollection<OutputTapeViewModel> m_SelectedOutputtapeList; 

    public ObservableCollection<OutputTapeViewModel> SelectedOutputtapeList 
    { 
     get 
     { 
      return m_SelectedOutputtapeList; 
     } 
     set 
     { 
      m_SelectedOutputtapeList = value; 

      NotifyPropertyChanged("SelectedOutputtapeList"); 
     } 
    } 
} 

凡OutputTapeViewModel聲明如下:

public class OutputTapeViewModel : ViewModelBase 
{ 
    private string m_Description; 

    public string Description 
    { 
     get 
     { 
      return m_Description; 
     } 
     set 
     { 
      m_Description = value; 

      NotifyPropertyChanged("Description"); 
     } 
    } 

    private bool m_IsSelected; 

    public string IsSelected 
    { 
     get 
     { 
      return m_IsSelected; 
     } 
     set 
     { 
      m_IsSelected = value; 

      NotifyPropertyChanged("IsSelected"); 
     } 
    } 
} 

重要的事情需要注意的是在我加入了的DisplayMemberPath屬性使用的列表框中OutputTapeViewModel類中的說明字段以顯示列表框中的內容。它還有一個項目容器樣式,它在列表框中選中時綁定到OutputTapeViewModel.IsSelected屬性。這OutputTapeViewModel.IsSelected允許您使用BTLogFrontEndViewModel.SelectedOutputtapeList財產等方式:

var selectedItems = SelectedOutputtapeList.Where(item => item.IsSelected); 

你的情況這隻能如果你不關心做LINQ表達的開銷。