Привет всем: D
В настоящее время я разрабатываю WPF-приложение "XML-редактор", которое содержит два макета:
- A строка меню , где пользователь может выбрать путь XML (Файл> Открыть),
- Панель редактора , которая загружает и отображает содержимое XML в предварительно определенном формате.
Вот общая архитектура:
![Overall architecture](https://i.stack.imgur.com/OTJhu.png)
В следующих строках показаны только соответствующие файлы, но дайте мне знать, если вам нужна дополнительная информация. В моем программном обеспечении MVVM нет модели, чтобы предоставить вам минимальное количество файлов.
In MainWindow.xaml :
<Window x:Class="Software.MainWindow"
xmlns:local="clr-namespace:Software"
xmlns:v="clr-namespace:Software.Views"
xmlns:vm="clr-namespace:Software.ViewModels"
...>
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<DockPanel>
<v:MenuBar x:Name="MenuBar" DockPanel.Dock="Top" Panel.ZIndex="1"/>
<v:Editor x:Name="Editor" HorizontalAlignment="Center"/>
</DockPanel>
</Grid>
</Window>
In MainWindow :
namespace Software
{
public partial class MainWindow : Window
{
public MainViewModel mainViewModel = new MainViewModel();
public MainWindow()
{
InitializeComponent();
MenuBar.DataContext = mainViewModel.MenuViewModel;
Editor.DataContext = mainViewModel.EditViewModel;
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
mainViewModel.MenuViewModel.selectXmlFile();
}
}
}
In MainViewModel :
namespace Software.Views
{
public class MainViewModel
{
public MenuBarViewModel MenuViewModel;
public EditorViewModel EditViewModel;
public MainViewModel()
{
MenuViewModel = new MenuBarViewModel();
EditViewModel = new EditorViewModel();
}
}
}
В MenuBar.xaml :
<UserControl x:Class="SmsReader.Views.MenuBar"
xmlns:vm="clr-namespace:SmsReader.ViewModels"
...>
<UserControl.DataContext>
<vm:MenuBarViewModel />
</UserControl.DataContext>
<Menu>
<MenuItem Header="File" >
<MenuItem Header="Open" Click="MenuItem_Click"/>
<Separator Margin="10, 0"/>
<MenuItem Header="Other"/>
</MenuItem>
<MenuItem Header="Other"/>
</Menu>
</UserControl>
In MenuBar :
namespace Software.Views
{
public partial class MenuBar : UserControl
{
public MenuBar()
{
InitializeComponent();
}
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuXmlPath = ((MenuBarViewModel) DataContext).getXmlFile();
}
}
}
В MenuBarViewModel :
namespace Software.ViewModels
{
public class MenuBarViewModel : INotifyPropertyChanged
{
private string xmlPath;
public string XmlPath
{
get { return xmlPath; }
set { xmlPath = value; Fire("XmlPath"); }
}
public void selectXmlFile()
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "XML files (*.xml)|*.xml|All files (*)|*.*";
XmlPath = (dialog.ShowDialog() == true) ? dialog.FileName : "";
}
public event PropertyChangedEventHandler PropertyChanged;
protected void Fire(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
В EditorViewModel :
namespace Software.ViewModels
{
public class EditorViewModel : INotifyPropertyChanged
{
private string xmlSource;
public string XmlSource
{
get { return xmlSource; }
set { xmlSource = value; Fire("XmlSource"); update(value); }
}
public void update(string xmlSource)
{
// Load XML data and display into the editor panel
}
public event PropertyChangedEventHandler PropertyChanged;
protected void Fire(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
Я бы хотел связать свойство "XmlSource" с "XmlPath". Какой самый элегантный способ реализовать это?
Любые советы, касающиеся архитектуры, будут приветствоваться!
Заранее спасибо:)