大家好:D
我目前正在开发一个包含两个布局的“ XML编辑器” WPF应用程序:
这是整体架构:
以下几行仅显示相关文件,但是如果您需要更多详细信息,请告诉我。我的MVVM软件中没有模型可以为您提供最少数量的文件。
在 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>
在 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();
}
}
}
在 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>
在 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”。实现此目的的最优雅的方法是什么?
关于架构的任何建议将受到欢迎! 提前谢谢:)