Свойства привязки от двух пользовательских элементов управления, которые имеют одинакового родителя - PullRequest
0 голосов
/ 09 ноября 2018

Привет всем: D

В настоящее время я разрабатываю WPF-приложение "XML-редактор", которое содержит два макета:

  • A строка меню , где пользователь может выбрать путь XML (Файл> Открыть),
  • Панель редактора , которая загружает и отображает содержимое XML в предварительно определенном формате.

Вот общая архитектура:

Overall architecture

В следующих строках показаны только соответствующие файлы, но дайте мне знать, если вам нужна дополнительная информация. В моем программном обеспечении 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". Какой самый элегантный способ реализовать это?

Любые советы, касающиеся архитектуры, будут приветствоваться! Заранее спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...