来自具有相同父项的两个用户控件的绑定属性

时间:2018-11-09 00:07:51

标签: c# wpf xaml binding

大家好:D

我目前正在开发一个包含两个布局的“ XML编辑器” WPF应用程序:

  • 菜单栏,用户可以在其中选择XML路径(“文件”>“打开”),
  • 编辑器面板,它以预定义的格式加载和显示XML内容。

这是整体架构:

Overall architecture

以下几行仅显示相关文件,但是如果您需要更多详细信息,请告诉我。我的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”。实现此目的的最优雅的方法是什么?

关于架构的任何建议将受到欢迎! 提前谢谢:)

0 个答案:

没有答案
相关问题