首页 > 解决方案 > 来自具有相同父级的两个用户控件的绑定属性

问题描述

大家好 :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>

主窗口中:

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>

菜单栏中

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”。实现这一点的最优雅的方法是什么?

顺便说一句,任何有关架构的建议都将受到欢迎! 先感谢您 :)

标签: c#wpfxamlbinding

解决方案


推荐阅读