Xamarin Forms页面继承泛型基类时g.cs文件修改被覆盖如何解决
解决Xamarin Forms泛型页面基类自动生成代码被覆盖问题
核心原因
自动生成的.g.cs分部类是XAML编译工具链根据XAML根节点配置自动生成的,每次XAML文件修改都会触发重写,任何手动修改的内容都会被清空,因此不要直接修改该文件,所有配置需通过XAML和自己编写的分部类完成。
可行解决方案
方案1:在XAML中直接声明泛型基类(推荐)
通过XAML的x:TypeArguments特性指定泛型参数,工具链会自动生成正确的泛型基类声明,无需手动修改.g.cs文件。
- XAML文件配置示例(假设你的泛型基类为
MyBaseContentPage<TViewModel>,当前页面对应的泛型参数为MyViewModel):
<local:MyBaseContentPage x:TypeArguments="local:MyViewModel" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:你的项目命名空间" x:Class="你的项目命名空间.MyContentPage"> <!-- 此处编写你的页面内容 --> </local:MyBaseContentPage>
- 自行编写的分部类配置:
// 该文件是你自己创建的.cs文件,不是自动生成的.g.cs文件 public partial class MyContentPage : MyBaseContentPage<MyViewModel> { public MyContentPage() { InitializeComponent(); } // 你的页面逻辑代码 }
方案2:兼容旧版本的过渡方案
如果使用的Xamarin Forms版本过旧不支持根节点泛型声明,可以新增一层非泛型基类做中转:
// 非泛型基类,继承ContentPage public class MyBaseContentPage : ContentPage { // 可以在这里放不需要泛型的公共逻辑 } // 泛型基类,继承非泛型基类 public class MyBaseContentPage<T> : MyBaseContentPage { // 在这里放需要泛型的公共逻辑 public T ViewModel { get; set; } }
这种场景下XAML根节点可以先声明为非泛型的MyBaseContentPage,你自己编写的分部类再继承泛型版本即可,不会和自动生成的代码冲突。
注意事项
x:TypeArguments中如果需要传入多个泛型参数,用逗号分隔即可,例如x:TypeArguments="local:FirstParam, local:SecondParam"- 确保XAML中声明的命名空间和对应类的实际命名空间完全一致,否则会触发编译错误
内容的提问来源于stack exchange,提问作者Ido Dvir
相关产品推荐
相关产品推荐

