dự án WPF của tôi sẽ được tổ chức như thế này:tách màn hình mà không cần dây ma thuật
Screens
Group1
Screen1
View.xaml
ViewModel.cs
Group2
Screen2
View.xaml
ViewModel.cs
Để hiển thị Screen1
từ Screen2
tôi sẽ sử dụng một cái gì đó như thế này: ScreenManager.Show("Group1.Screen1")
này ngoại hình (sử dụng phản ánh) trong Screens.Group1.Screen1
không gian tên cho một View và một ViewModel và instantiates chúng.
Làm cách nào để loại bỏ chuỗi ma thuật mà không cần ghép nối Screen1
và Screen2
(Tôi không muốn các lớp trong Screen2
sử dụng không gian tên Screen1
). Ngoài ra, tôi muốn một số loại khám phá màn hình (autocompletion/intellisense)
Hoặc có thể một số cách (tự động kiểm tra) để xác minh rằng tất cả các cuộc gọi đến ScreenManager.Show
đều hợp lệ.
Cập nhật: tôi đến với điều này:
public class ScreenNames
{
public Group1Screens Group1;
public class Group1Screens
{
public ScreenName Screen1;
}
}
public sealed class ScreenName
{
private ScreenName() { }
}
public class ScreenManager : IScreenManager
{
public void Show(Expression<Func<ScreenNames, ScreenName>> x) {}
}
Cách sử dụng:
screenManager.Show(x=>x.Group1.Screen1);
Không lý tưởng nhưng tôi giả sử vi phạm DRY vẫn là tốt hơn so với dây ma thuật. Và tôi có thể tự động kiểm tra (với sự phản ánh) rằng tất cả các cuộc gọi là hợp lệ.
Tại sao Screen2 cần biết về Screen1? Trình quản lý màn hình có tồn tại bên ngoài mỗi màn hình không? Và bởi Intellisense, bạn đang nói rằng trong quá trình phát triển bạn muốn có mỗi tên của màn hình xuất hiện trong droplist khi bạn bắt đầu gõ ScreenManager.Show()? Danh sách các màn hình tĩnh hay động (tải tại thời gian chạy)? – Dave
Cuối cùng tôi sẽ pas một tham số; ScreenManager sẽ là một thuộc tính của ViewModel; Đối với intellisense tôi nghĩ rằng một danh sách tĩnh là phải:/ Tôi nghĩ rằng tôi có thể có một cái gì đó như thế này: ScreenManager.Show (x => x.Group1.Screen1) –
sử dụng như ScreenManager.Show (x => x.Group1.Screen1) sẽ có nghĩa là tôi sẽ phải giữ và duy trì một danh sách riêng biệt của màn hình nhưng tôi nghĩ rằng không có cách nào khác nếu tôi muốn intellisense –