How to support ListBox SelectedItems binding with MVVM in a navigable application

前端 未结 9 1215
有刺的猬
有刺的猬 2020-11-27 15:06

I am making a WPF application that is navigable via custom \"Next\" and \"Back\" buttons and commands (i.e. not using a NavigationWindow). On one screen, I have

9条回答
  •  失恋的感觉
    2020-11-27 15:53

    Not satisfied with the given answers I was trying to find one by myself... Well it turns out to be more like a hack then a solution but for me that works fine. This Solution uses MultiBindings in a special way. First it may look like a ton of Code but you can reuse it with very little effort.

    First I implemented a 'IMultiValueConverter'

    public class SelectedItemsMerger : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            SelectedItemsContainer sic = values[1] as SelectedItemsContainer;
    
            if (sic != null)
                sic.SelectedItems = values[0];
    
            return values[0];
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return new[] { value };
        }
    }
    

    And a SelectedItems Container/Wrapper:

    public class SelectedItemsContainer
    {
        /// Nothing special here...
        public object SelectedItems { get; set; }
    }
    

    Now we create the Binding for our ListBox.SelectedItem (Singular). Note: You have to create a static Resource for the 'Converter'. This may be done once per application and be reused for all ListBoxes that need the converter.

    
     
      
      
     
    
    

    In the ViewModel I created the Container where I can bind to. It is important to initialize it with new() in order to fill it with the values.

        SelectedItemsContainer selectionContainer = new SelectedItemsContainer();
        public SelectedItemsContainer SelectionContainer
        {
            get { return this.selectionContainer; }
            set
            {
                if (this.selectionContainer != value)
                {
                    this.selectionContainer = value;
                    this.OnPropertyChanged("SelectionContainer");
                }
            }
        }
    

    And that's it. Maybe someone sees some improvements? What do You think about it?

提交回复
热议问题