2014-09-24 83 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表达的开销。