public void AutoBindOnChangedModelIdentitiesPasses()
        {
            var nameBinderQueryPath    = "name";
            var logicalBinderQueryPath = "#log";
            var styleBinderQueryPath   = ".stl";

            var allBinder = new ModelViewBinder("*", null
                                                , new ModelViewBinder.BindInfo(typeof(EmptyViewObjClass)));
            var nameBinder = new ModelViewBinder(nameBinderQueryPath, null
                                                 , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var logicalBinder = new ModelViewBinder(logicalBinderQueryPath, null
                                                    , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));
            var styleBinder = new ModelViewBinder(styleBinderQueryPath, null
                                                  , new ModelViewBinder.BindInfo(typeof(IntViewObjClass)));

            var viewInstanceCreator = new DefaultViewInstanceCreator(
                (typeof(EmptyViewObjClass), new EmptyViewObjClass.Binder()),
                (typeof(IntViewObjClass), new IntViewObjClass.Binder())
                );
            var binderMap = new ModelViewBinderMap(viewInstanceCreator,
                                                   allBinder,
                                                   nameBinder,
                                                   logicalBinder,
                                                   styleBinder);
            var bindInstanceMap = new ModelViewBinderInstanceMap(binderMap);

            var root = new ModelClass()
            {
                Name = "root"
            };
            var apple = new ModelClass()
            {
                Name = "apple", Parent = root
            };
            var orange = new ModelClass()
            {
                Name = "orange", Parent = root
            };
            var grape = new ModelClass()
            {
                Name = "grape", Parent = orange
            };

            bindInstanceMap.RootModel = root;

            {//Nameを切り替えた時のテスト
                // root.Name => "name"
                // - rootのBinder -> nameBinderに変更される
                root.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.Name => "root"
                // - rootのBinder -> allBinderに変更される
                root.Name = "root";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                // apple.Name => "name"
                // - appleのBinder -> nameBinderに変更される
                apple.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[apple].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // apple.Name => "apple"
                // - appleのBinder -> allBinderに変更される
                apple.Name = "apple";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[apple].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // grape.Name => "name"
                // - grapeのBinder -> nameBinderに変更される
                grape.Name = nameBinderQueryPath;
                Assert.AreSame(nameBinder, bindInstanceMap.BindInstances[grape].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");

                // grape.Name => "root"
                // - grapeのBinder -> allBinderに変更される
                grape.Name = "grape";
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, "ルートModelの階層内のModelのNameが変更された時も、バインドを切り替えるようにしてください");
            }

            {//LogicalIDを切り替えた時のテスト
                // root.LogicalID => "log"
                // - rootのBinder -> logicalBinderに変更される
                root.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.LogicalID => ""
                // - rootのBinder -> allBinderに変更される
                root.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                var errorMessage = "ルートModelの階層内のModelのLogicalIDが変更された時も、バインドを切り替えるようにしてください";
                // orange.LogicalID => "log"
                // - orangeのBinder -> logicalBinderに変更される
                orange.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // orange.LogicalID => ""
                // - orangeのBinder -> allBinderに変更される
                orange.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // grape.LogicalID => "log"
                // - grapeのBinder -> logicalBinderに変更される
                grape.AddLogicalID(logicalBinderQueryPath);
                Assert.AreSame(logicalBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);

                // grape.LogicalID => ""
                // - grapeのBinder -> allBinderに変更される
                grape.RemoveLogicalID(logicalBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);
            }

            {//StylingIDを切り替えた時のテスト
                // root.StylingID => "stl"
                // - rootのBinder -> styleBinderに変更される
                root.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[root].Binder);

                // root.StylingID => ""
                // - rootのBinder -> allBinderに変更される
                root.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[root].Binder);

                var errorMessage = "ルートModelの階層内のModelのStylingIDが変更された時も、バインドを切り替えるようにしてください";
                // orange.StylingID => "log"
                // - orangeのBinder -> styleBinderに変更される
                orange.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // orange.StylingID => ""
                // - orangeのBinder -> allBinderに変更される
                orange.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[orange].Binder, errorMessage);

                // grape.StylingID => "log"
                // - grapeのBinder -> styleBinderに変更される
                grape.AddStylingID(styleBinderQueryPath);
                Assert.AreSame(styleBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);

                // grape.StylingID => ""
                // - grapeのBinder -> allBinderに変更される
                grape.RemoveStylingID(styleBinderQueryPath);
                Assert.AreSame(allBinder, bindInstanceMap.BindInstances[grape].Binder, errorMessage);
            }
        }