public CDAlbumDescriptorCreatorViewModel(AmbigueousCDInformationArgs cadi, IMusicSession session)
        {
            _CADI = cadi;
            _Session = session;

            _CDInfos.AddCollection(_CADI.CDInfos);

            _Authours = new ObservableCollection<IArtist>();
            _Authours.CollectionChanged += _Authours_CollectionChanged;

            if (CDInfos.Count == 0)
            {
                Created = Default.GetEditable();
            }
            else if (CDInfos.Count == 1)
            {
                Created = CDInfos[0].FindItem.GetEditable();
            }

            _ArtistSearchableFactory = new ArtistSearchableFactory(_Session);  
            
            GenreFactory = FactoryBuilder.Instanciate((n) => _Session.GetGenreFactory().Create(n));

            CommitCommand = RelayCommand.Instanciate(() => OnCommintCommand());

            InternetFind = RelayCommand.InstanciateAsync(() => FindAdditionalInfoFromWebAsync());

            iTunesFind = RelayCommand.InstanciateAsync(() => FindAdditionalInfoFromiTunesAsync());
        }
        public void TD()
        {
            Init();

            var tr2 = TimeTracer.TimeTrack("Session Building");
            using (tr2)
            {
                _MS = MusicSessionImpl.GetSession(_SK.Builder);
                GC.Collect();
                GC.WaitForFullGCComplete();
            }

            Assert.That(_MS.AllAlbums.Count, Is.EqualTo(0));
            Assert.That(_MS.AllGenres.Count, Is.EqualTo(0));
            Assert.That(_MS.AllArtists.Count, Is.EqualTo(0));

            var tr = TimeTracer.TimeTrack("Load");
            using (tr)
            {
                IMusicImporter imi = _MS.GetDBImporter();
                Assert.That(imi, Is.Not.Null);
                imi.Load();
            }
            GC.Collect();
            GC.WaitForFullGCComplete();
        }
        public  WebAlbumSelectorViewModel(IMusicSession ims,  IModifiableAlbum imad, int iMaxResult=5)
        {
            _IModifiableAlbum = imad;
            _IMS = ims; 
            
            _IsLoading = true;
            _FoundSomething = true;
     
            _MergeStategy = MergeStategy.OnlyCover;

            var lookfor = imad.GetAlbumDescriptor();

            IWebQuery wb = ims.WebQueryFactory.FromAlbumDescriptor(lookfor);
            wb.NeedCoverArt = true;
            wb.MaxResult = iMaxResult;

            _OriginalAlbumName = lookfor.ToString();
            _IInternetFinder = ims.GetInternetFinder(wb);

            SelectCover = Register(RelayCommand.InstanciateAsync(()=>DoSelect(), () => SelectedInfos.Count>0));
            Cancel = Register(RelayCommand.Instanciate(DoCancel, ()=>IsLoading));
            Close = RelayCommand.Instanciate(DoClose);

            //LoadResult().DoNotWaitSafe();
        }
        public void SetUp()
        {
           
            _wpfTester = new WPFTester();

            _window = new Window();

            _wpfTester.ShowWindow(_window);

            Init();
            _ISession = MusicSessionImpl.GetSession(_SK.Builder, new WPFHwndProvider(_window));
            _Session = _ISession as MusicSessionImpl;

           IMusicImporter imi = _ISession.GetDBImporter();
           imi.Load();

           IDirectoryImporterBuilder imib = _ISession.GetImporterBuilder(MusicImportType.Directory) as IDirectoryImporterBuilder;
           Assert.That(imib, Is.Not.Null);
           imib.Directory = DirectoryIn;
           imib.DefaultAlbumMaturity = AlbumMaturity.Discover;

           Assert.That(imib.IsValid, Is.True);
           imi = imib.BuildImporter();
           Assert.That(imi, Is.Not.Null);
           imi.Load();
        }
        public MoveAlbumFileWindowViewModel(IMusicSession ims, IEnumerable<IAlbum> al)
        {
            _IMusicSession = ims;
            AllAlbums = al;
            Directory = _IMusicSession.Setting.MusicImporterExporter.PathMove;
            _SelectedAlbums = new WrappedObservableCollection<IAlbum>();
            _SelectedAlbums.CollectionChanged += inc_CollectionChanged;

            Move = this.Register( RelayCommand.Instanciate(() => DoMove(), ()=>IsValid));
        }
 private MusicEntitiesEditorViewModel(IMusicSession session)
 {
     _IMS = session;
     ArtistSearchableFactory = new ArtistSearchableFactory(session);
     
     Genres = Register( _IMS.AllGenres.LiveOrderBy(global => global.FullName));
     Commit = RelayCommand.Instanciate(DoCommit);
     GenreFactory = FactoryBuilder.Instanciate((n) => session.GetGenreFactory().Create(n));
     YearFactory = FactoryBuilder.Instanciate((n) => { int res = 0; int.TryParse(n, out res); return res; });
     NameFactory = FactoryBuilder.Instanciate((n) => n);
 }
        internal SingleTrackUpdater(Track track, IMusicSession iContext):base(track.SingleItemCollection(), iContext)
        {
            _Tr = track;
            if (_Tr == null)
                throw new Exception("Track can not be null");

            this._Artist = _Tr.Artist;
            this._Name= _Tr.Name;
            this._TN= _Tr.TrackNumber;
            this._DiscNumber = _Tr.DiscNumber;
        }
 public Exporter(IMusicSession iSession, IEnumerable<IAlbum> iAlbums)
 {
     Session = iSession;
     _session = Session.Setting.MusicImporterExporter;
     Option = _session.LastExportType;
     Directory = _session.OutputPath;
     iPodExport = _session.SynchronizeBrokeniTunes;
     _Albums = iAlbums.ToList();
     _SelectedAlbums = new WrappedObservableCollection<IAlbum>();
     _SelectedAlbums.CollectionChanged += SelectedAlbums_CollectionChanged;
     OK = this.Register(RelayCommand.Instanciate(() => DoOK(), () => IsValid));
     Cancel = RelayCommand.Instanciate(() => Window.Close());
 }
        public ImporterViewModel(IMusicSession iSession)
        {
            Continue = false;
            _Session = iSession;
            _IMusicSettings = _Session.Setting;
            Option = _IMusicSettings.MusicImporterExporter.LastImportType;

            UpdateBuilder();

            OK = Register(RelayCommand.Instanciate(
                Commit,
                () => (Builder != null) && (Builder.IsValid)
                ));
        }
        public AlbumEditorViewModel(IMusicSession iMusicSession, IModifiableAlbum iModifiableAlbum)
        {
            _IModifiableAlbum = iModifiableAlbum;
            _Session = iMusicSession;

            ArtistSearchableFactory = new ArtistSearchableFactory(iMusicSession);

            GenreFactory = FactoryBuilder.Instanciate((n) => iMusicSession.GetGenreFactory().Create(n));

            Images = _IModifiableAlbum.Images;
            SelectedImages = new WrappedObservableCollection<IAlbumPicture>();
            

            if (Images.Count > 0)
                SelectedImage = Images[0];

            Images.CollectionChanged += Images_CollectionChanged;
                
            SelectedTracks = new WrappedObservableCollection<IModifiableTrack>();

            Authours = _IModifiableAlbum.Artists;
            _Genre = iMusicSession.GetGenreFactory().Get(_IModifiableAlbum.Genre);
            Genres = Register(iMusicSession.AllGenres.LiveOrderBy(global => global.FullName));

            Tracks = new WrappedObservableCollection<IModifiableTrack>(_IModifiableAlbum.Tracks.
                OrderBy(t => t.DiscNumber).ThenBy(t => t.TrackNumber).ThenBy(t => t.Name));

            SetFrontCover = Register(RelayCommand.Instanciate<IAlbumPicture>(SetToFront, ial => (ial != null) && Images.IndexOf(ial) > 0));
            ToLast = Register(RelayCommand.Instanciate<IAlbumPicture>(SetToLast, ial => (ial != null) && Images.IndexOf(ial) != Images.Count - 1));

            SplitImage = Register(RelayCommand.Instanciate<IAlbumPicture>(DoSplitImage, ial => ial != null));
            RotateImageRight = Register(RelayCommand.Instanciate<IAlbumPicture>((al)=>DoRotateImage(al,true), ial => ial != null));
            RotateImageLeft = Register(RelayCommand.Instanciate<IAlbumPicture>((al) => DoRotateImage(al, false), ial => ial != null));
            DeleteImage = Register(RelayCommand.Instanciate<IAlbumPicture>(DoDeleteImage, ial => ial != null));
            ImageFromFile = RelayCommand.Instanciate(DoImageFromFile);
            PasteImage = RelayCommand.InstanciateStatic(DoPasteImage, CanExecuteImage);

            DeleteTrack = Register(RelayCommand.Instanciate<IModifiableTrack>(DoDeleteTrack, ial => ial != null));
            WindowOpenTrack = Register(RelayCommand.Instanciate<IModifiableTrack>(DoWindowOpenTrack, ial => ial != null));
            UpdateFromFileName = Register(RelayCommand.Instanciate<IModifiableTrack>(DoUpdateFromFileName, ial => ial != null));
            RemoveTrackNumber= Register(RelayCommand.Instanciate<IModifiableTrack>(DoRemoveTrackNumber, ial => ial != null));
            PreFixByArtistName = Register(RelayCommand.Instanciate<IModifiableTrack>(DoPreFixByArtistName, ial => ial != null));
            ChangeDiscNumber = Register(RelayCommand.Instanciate<IModifiableTrack>(DoChangeDiscNumber, ial => ial != null));

            FindFromDB = RelayCommand.Instanciate(DoFindFromInternet);
            BrowseInternet = RelayCommand.Instanciate(FindOnInternet);
            OK = RelayCommand.Instanciate(DoCommit);
        }
        protected void baseSetUp()
        {
            _IMusicSession = MusicSessionImpl.GetSession(_SK.Builder);

            _IMusicSession.AllAlbums.Should().BeEmpty();
            _IMusicSession.AllGenres.Should().BeEmpty();
            _IMusicSession.AllArtists.Should().BeEmpty();

            IMusicImporter imi = _IMusicSession.GetDBImporter();
            _IMusicSession.Should().NotBeNull();
            imi.Load();

            Console.WriteLine("Importing Music Folder");

            PostOpen(_IMusicSession);
        }
        public CenteredAlbumViewModel(IList<IAlbum> iAlbums, IMusicSession isession)
        {
            Albums = iAlbums;

            AlbumDistanceComparerFactory adcf = new AlbumDistanceComparerFactory(isession);
            _OrderByAfinity = new AfinityCollection<IAlbum>(this.Albums, al => adcf.GetComparer(al), 50);
            AffinityOrderedCollection = _OrderByAfinity.Collection;

            //CenterAlbum = Albums.MaxBy(isession.AlbumSorter.Sorter);
            _OrderByAfinity.Reference = Albums.MaxBy(isession.AlbumSorter.Sorter);

            ChangeArtist = RelayCommand.Instanciate(DoChangeArtist);
            ChangeGenre = RelayCommand.Instanciate(DoChangeGenre);
            Random = RelayCommand.Instanciate(DoRandom);
            ChangeAlbum = RelayCommand.Instanciate(DoChangeAlbum);
            Center = RelayCommand.Instanciate<IAlbum>(al => CenterAlbum = al);
        }
        internal static ViewModelBase FromEntities(IEnumerable<IObjectAttribute> entities, IMusicSession ims)
        {
            int count = entities.Count();

            if (count == 0)
                return null;

            IObjectAttribute ent = entities.First();

            if (count == 1)
            {
                IAlbum al = ent as IAlbum;
                if (al != null)
                {
                    IModifiableAlbum IAM = al.GetModifiableAlbum();
                    if (IAM != null)
                    {
                        return new AlbumEditorViewModel(ims, IAM);
                    }

                    return BusyMV();
                }
            }

      
            if (ent is IAlbum)
            {
                var all = entities.Cast<IAlbum>();
                if (!CheckAlbums(all))
                    return BusyMV();

                return new MusicEntitiesEditorViewModel(ims, all);
            }

            if (ent is ITrack)
            { 
                var trcs = entities.Cast<ITrack>();
                if (!CheckAlbums(trcs.Select(t=>t.Album).Distinct()))
                    return BusyMV();

                return new MusicEntitiesEditorViewModel(ims, trcs);
            }

            return null;
        }
        public void SetUp()
        {
            Init();
            _ISession = MusicSessionImpl.GetSession(_SK.Builder);
            _Session = _ISession as MusicSessionImpl;

            IMusicImporter imi = _ISession.GetDBImporter();
            imi.Load();

            IDirectoryImporterBuilder imib = _ISession.GetImporterBuilder(MusicImportType.Directory) as IDirectoryImporterBuilder;
            Assert.That(imib, Is.Not.Null);
            imib.Directory = DirectoryIn;
            imib.DefaultAlbumMaturity = AlbumMaturity.Discover;

            Assert.That(imib.IsValid, Is.True);
            imi = imib.BuildImporter();
            Assert.That(imi, Is.Not.Null);
            imi.Load();
        }
        protected override void PostOpen(IMusicSession ims)
        {
            ims.AllAlbums.Should().BeEmpty();
            ims.AllGenres.Count.Should().Be(25);
            ims.AllArtists.Should().BeEmpty();

            IDirectoryImporterBuilder imib = ims.GetImporterBuilder(MusicImportType.Directory) as IDirectoryImporterBuilder;
            imib.Should().NotBeNull();
            imib.Directory = DirectoryIn;
            imib.DefaultAlbumMaturity = AlbumMaturity.Discover;

            imib.IsValid.Should().BeTrue();
            IMusicImporter imi = imib.BuildImporter();
            imi.Should().NotBeNull();
            imi.Load();

            ims.ShouldHaveAlbumsLike(Albums[0], AlbumDescriptorCompareMode.AlbumandTrackMD);

        }
        public AplicationViewModel(IMusicSession iIMusicSession)
        {
            _IMusicSession = iIMusicSession;
            Player = new PlayerViewModel(_IMusicSession.MusicPlayer, _IMusicSession.PlayListFactory);

            Player.PlayingAlbums.CollectionChanged += PlayingAlbums_CollectionChanged;

            ShowSettings = RelayCommand.Instanciate(DoShowSettings);
            Import = RelayCommand.InstanciateAsync(() => DoImport(), false);
            iPodSync = RelayCommand.InstanciateAsync(() => DoiPodSynchro());
            Move = RelayCommand.Instanciate<IAlbum>(DoMove, al => NotBroken(al));
            Export = RelayCommand.InstanciateAsync<IAlbum>(DoExport, al => NotBroken(al), false);
            Edit = RelayCommand.InstanciateAsync<object>((ims) => DoEdit(ims));
            Delete = RelayCommand.InstanciateAsync<object>((ims) => DoDelete(ims));
            Play = RelayCommand.InstanciateAsync<object>((o) => DoPlay(o), false);
            GoToArtist = RelayCommand.InstanciateAsync<IArtist>(ar => DoGoToArtist(ar));
            GoToGenre = RelayCommand.Instanciate<IGenre>( g => DoGoToGenre(g));

            Settings = _IMusicSession.Setting;
            AlbumSorter = _IMusicSession.AlbumSorter;
            AlbumSorter.OnChanged += AlbumSorter_OnChanged;

            RemoveTrackNumber = RelayCommand.Instanciate<TrackView>(DoRemoveTrackNumber);
            PrefixArtistName = RelayCommand.Instanciate<TrackView>(DoPrefixArtistName);

            AllAlbums = _IMusicSession.AllAlbums;
            AllTracks = _IMusicSession.AllTracks.SelectLive(t => TrackView.GetTrackView(t));

            Tracks = AllTracks;
            Albums = AllAlbums;

            GoToPlay = Register(RelayCommand.Instanciate(() => Show(MainDisplay.Play), () => Player.ShoulBePlayed && (MainDisplay == MainDisplay.Browse)));
            GoToBrowse = Register(RelayCommand.Instanciate(() => Show(MainDisplay.Browse), () => Player.ShoulBePlayed && (MainDisplay == MainDisplay.Play)));
            FocusOnPlay = RelayCommand.Instanciate(DoFocusOnPlay);

            _PresenterMode = _IMusicSession.Setting.AparencyUserSettings.PresenterMode;

            Finder = new FindItemsControlViewModel(_IMusicSession.EntityFinder, this);

            _SelectedTracks.CollectionChanged += SelectedTracks_CollectionChanged;
        }
        public void SetUp()
        {
            base.Init();

            _AddDirectory = Path.Combine(this.DirectoryIn, "Greg Kelley And Co");
            Directory.CreateDirectory(_AddDirectory);

            string copysong = Path.Combine(_AddDirectory, "02 One To Grow On.mp3");
            string mysong = Path.Combine(this.DirectoryIn, "02 One To Grow On.mp3");

            FileInfo fi = new FileInfo(mysong);
            fi.MoveTo(copysong);

            _MainDirectory = Path.Combine(this.DirectoryIn, "Main");
            Directory.CreateDirectory(_MainDirectory);

            DirectoryInfo di = new DirectoryInfo(this.DirectoryIn);
            foreach (FileInfo fif in di.GetFiles())
            {
                if (Path.GetExtension(fif.Name) != ".xml")
                {
                    string Des = Path.Combine(_MainDirectory, fif.Name);
                    fif.MoveTo(Des);
                }
            }

            _MS = MusicSessionImpl.GetSession(_SK.Builder);
            _msi = _MS as MusicSessionImpl;

            IMusicImporter imi = _MS.GetDBImporter();
            Assert.That(imi, Is.Not.Null);
            imi.Load();

            Assert.That(_msi.AllAlbums.Count, Is.EqualTo(0)); 
            Assert.That(_msi.AllArtists.Count, Is.EqualTo(0));
            Assert.That(_msi.AllGenres.Count, Is.EqualTo(25));
           

        }
        //internal static IWindow GetWindowFromImporterror(ImportExportErrorEventArgs Ev, IMusicSession ims)
        //{
        //    CorruptedRarOrMissingPasswordArgs cmp = Ev as CorruptedRarOrMissingPasswordArgs;
        //    if (cmp != null)
        //    {
        //        return new RarPasswordWindow(cmp);
        //    }

        //    AmbigueousCDInformationArgs acdia = Ev as AmbigueousCDInformationArgs;
        //    if (acdia != null)
        //    {
        //        var cdinfos = new CDAlbumDescriptorCreatorViewModel(acdia,ims);
        //        return new CDImportInfoEditor() { ModelView = cdinfos };
        //    }

        //    CDCoverInformationArgs cdia = Ev as CDCoverInformationArgs;
        //    if (cdia != null)
        //    {
        //        WebAlbumFoundSelectorViewModel waw = new WebAlbumFoundSelectorViewModel(cdia, ims.Strategy);
        //        return new InternetResultWindow() { ModelView = waw };
        //    }

        //    return new CustoMessageBox(Ev);
        //}

        internal static ViewModelBase GetViewModelBaseFromImporterror(ImportExportError Ev, IMusicSession ims)
        {
            CorruptedRarOrMissingPasswordArgs cmp = Ev as CorruptedRarOrMissingPasswordArgs;
            if (cmp != null)
            {
                return new RarPasswordViewModel(cmp);
            }

            AmbigueousCDInformationArgs acdia = Ev as AmbigueousCDInformationArgs;
            if (acdia != null)
            {
                return new CDAlbumDescriptorCreatorViewModel(acdia, ims);
            }

            CDCoverInformationArgs cdia = Ev as CDCoverInformationArgs;
            if (cdia != null)
            {
               return new WebAlbumFoundSelectorViewModel(cdia, ims.Strategy);
            }

            return new ImportExportErrorEventArgsViewModel(Ev);
        }
        private void PerfRun(IMusicSession ms, List<IExtendedObservableCollection<IObservableGrouping<IArtist, IAlbum>>> l)
        {
            for (int i = 0; i < _MaxCount; i++)
            {
                l.Add(ms.AllAlbums.LiveSelectManyTuple(a => a.Artists).LiveToLookUp((t) => t.Item2, (t) => t.Item1).LiveOrderBy((a) => a.Key.Name));

            }
        }
 public WindowsPhoneExporter(IInternalMusicSession ims)
 {
     _Ims = ims;
     _IIC = ims.GetNewSessionContext();
 }
        public void TD()
        {
            Init();

            
            
            ThreadProperties TP = new ThreadProperties( ThreadPriority.Highest,ProcessPriorityClass.High);
            TP.SetCurrentThread();

            //Thread.CurrentThread.Priority = ThreadPriority.Highest;
            //Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;

            var tr2 = TimeTracer.TimeTrack("Session Building");
            using (tr2)
            {
                _MS = MusicSessionImpl.GetSession(_SK.Builder);
                _msi = _MS as MusicSessionImpl;
                GC.Collect();
                GC.WaitForFullGCComplete();
            }

            _BuildSessionTime = (TimeSpan)tr2.EllapsedTimeSpent;

            Assert.That(_MS.AllAlbums.Count, Is.EqualTo(0));
            Assert.That(_MS.AllGenres.Count, Is.EqualTo(0));
            Assert.That(_MS.AllArtists.Count, Is.EqualTo(0));



            var tr = TimeTracer.TimeTrack("Load before vacuum");
            using (tr)
            {
                IMusicImporter imi = _MS.GetDBImporter();
                Assert.That(imi, Is.Not.Null);
                imi.Load();
            }

            _OpenTime = (TimeSpan)tr.EllapsedTimeSpent;


            Assert.That(_MS.AllAlbums.Count, Is.EqualTo(_AlbumNumber));
            Assert.That(_MS.AllArtists.Count, Is.EqualTo(_ArtistNumber));

            GC.Collect();
            GC.WaitForFullGCComplete();
        }
 public MusicEntitiesEditorViewModel(IMusicSession iims, IEnumerable<IAlbum> albums):this(albums.First().Session)
 {
     _MYMod = iims.GetAlbumEditor(albums);
 }
 public MusicEntitiesEditorViewModel(IMusicSession iims, IEnumerable<ITrack> tracks):this(tracks.First().Album.Session)
 {
     _MYMod = iims.GetTrackEditor(tracks);
 }
 public ExportKeyViewModel(IMusicSession imusicsession) :
     this(imusicsession.Setting.WebUserSettings.GetDiscogsAutentificator(), imusicsession.Dependencies)
 {
 }
 public AlbumDistanceComparerFactory(IMusicSession iSession)
 {
     _Session = iSession;
 }
        private static void OnException(UnhandledExceptionEventArgs e, IMusicSession Ims)
        {
            if (_EventDone)
                return;

            ExceptionManager em = new ExceptionManager(Ims, e.ExceptionObject);

            SilentException se = e.ExceptionObject as SilentException;

            bool sendemail = (se!=null) ? se.SendEmail : (MessageBox.Show(
                string.Format("Music Collection encountered a fatal error and needs to close.{0}Click Ok to allow music collection to communicate details about the error to administator.{0}This will help improving Music collection quality. {0}", Environment.NewLine)
                , "Fatal Error Detected", MessageBoxButton.OKCancel) == MessageBoxResult.OK);

            em.Deal(sendemail);

            _EventDone = true;
        }
        private static void Execute(string[] args)
        {
            MusicCollectionWPF.App app = new MusicCollectionWPF.App();

            using (_IS = MusicSession.GetSession(new WPFHwndProvider()))
            {
                AppDomain.CurrentDomain.UnhandledException += (o, e) => OnException(e, _IS);

                _SplashScreen = new MusicCollectionWPF.Windows.SplashScreen(new SplashScreenViewModel(_IS.SplashScreen));
                _SplashScreen.Loaded += slaphscreen_Loaded;
                app.Run(_SplashScreen);

                if (_MusicImporterService != null)
                {
                    _MusicImporterService.Dispose();
                    _MusicImporterService = null;
                }
            }
        }
 public ArtistGrain(IAccountsSession session, IMusicSession musicSession)
     : base(session)
 {
     _musicSession = musicSession;
 }
 protected virtual void PostOpen(IMusicSession ims)
 {
 }
        internal AlbumInfoEditor(IEnumerable<Track> tracks, IMusicSession iContext)
        {
            Tracks = tracks.ToList();

            var ab = Tracks.Select(t => t.RawAlbum).Distinct();

            AlbumMaturity DefaultAlbumMaturity = ab.Any(a => a.Maturity == AlbumMaturity.Discover) ? AlbumMaturity.Discover : AlbumMaturity.Collection;
            Context = (iContext as IInternalMusicSession).GetNewSessionContext(DefaultAlbumMaturity);

            //AutorOption = new OptionChooserArtist(ab.Select(alb => alb.Author).Distinct(), Context.Session);
            ArtistOption = new OptionArtistChooser(ab.Select(alb => alb.Artists), Context.Session);
            GenreOption = new OptionChooser<string>(ab.Select(alb => alb.Genre).Distinct());
            YearOption = new OptionChooser<int?>(ab.Select(alb => (int?)alb.Year).Distinct());
            NameOption = new OptionChooser<string>(ab.Select(alb => alb.Name).Distinct());
        }
 public DiscEditor(IModifiableAlbum Al, IMusicSession Session)
 {
     DataContext = Al;
    InitializeComponent();
    (Editor as ISessionAcessor).Session = Session;
 }