首页 > 解决方案 > Java中的MVVM,无需更改模型(及其业务逻辑)

问题描述

在我的业务逻辑模型中,我使用一个带有 ArrayList 的类来存储 Content 类型的对象。一切正常。

但是,我不知道如何将该模型绑定到 ModelView,而不对模型进行任何更改(getter/setter 除外)。

(编辑:)我的意思是:所有与模型相关的类都不能更改为属性(例如 String -> SimpleStringProperty)

是否可以在不更改模型的情况下实现 MVVM(例如将 ArrayList 更改为 ObservableArrayList 等)?

(业务逻辑)模型:

    public class Model {
         UploaderDB uploaderDB = new UploaderDB();
         [...]

         public UploaderDB getUploaderDB() {
              return this.uploaderDB;
         }
    }
    public class UploaderDBImpl implements UploaderDB {
        private List<Uploader> uploaderList = new ArrayList<>();

        public List<Uploader> getUploaderList() {
             return this.uploaderList;
        }
    }
    public class UploaderImpl implements Uploader {
        public String name;

        public String getName() {
             return this.name;
        }
    }

模型视图

    public class ViewModel {
        private ObservableList<Uploader> items;

        public ViewModel() {
        items = FXCollections.observableArrayList(model.getUploaderDB().getUploaderList());
        }
    }

视图(MainWindow.java 作为控制器,MainWindow.fxml)

    public class MainWindow {
        @FXML
        private TableView<UploaderDB> uploaderTable;

        @FXML public void initialize(URL fxmlFileLocation, ResourceBundle resources {    
uploaderTable.itemsProperty().bind(modelView.items);
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.control.cell.PropertyValueFactory?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.layout.VBox?>
    <AnchorPane prefHeight="700.0" prefWidth="1100.0"             
    xmlns="http://javafx.com/javafx/8.0.172-ea"         
    xmlns:fx="http://javafx.com/fxml/1" fx:controller="gui.MainWindow">
       <children>
          <VBox layoutX="14.0" layoutY="14.0" prefHeight="581.0" 
    prefWidth="662.0">
         <children>
    <TableView fx:id="uploaderTable" prefHeight="581.0" prefWidth="396.0" >

               <columns>
                   <TableColumn  prefWidth="180.0" text="Name" >
                       <cellValueFactory>
                           <PropertyValueFactory property="$uploaderName" />
                      </cellValueFactory>
                   </TableColumn>
                   <TableColumn  prefWidth="100.0" text="Uploads" >
                       <cellValueFactory>
                           <PropertyValueFactory property="" />
                       </cellValueFactory>
                   </TableColumn>
            </columns>
                <!--</!-->
            </TableView>
         </children></VBox>
    </AnchorPane>

标签: javajavafxmodel-view-controllermvvmfxml

解决方案


如果你想在模型中更新你的,你不List应该使用.ObservableListObservableArrayList

从@Tunaki 看到这个答案

ObservableList 不更新 ArrayList


推荐阅读