在ViewModels之间共享对象的正确方法

已加入
2018年8月5日
留言内容
16
编程经验
1-3
我所做的我有Class1

Class1:
 public class Class1
    {
        public Class1(string x)
        {
            X = x;
        }
        public string X { get; set; }
    }


我有主窗口

main window:
<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>

        <StackPanel>
            <TextBox Text="{Binding C1.X, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>

            <ListBox Margin="5" Name="EventList"
                         ItemsSource="{Binding SensorEventList,UpdateSourceTrigger=PropertyChanged,IsAsync=True}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ContentControl Content="{Binding}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
    </Grid>
</Window>

和代码隐藏:

主窗口代码后面:
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MainWindowViewModel();
        }
    }


我创建了class1对象,并将其传递给UserControleSub构造函数,这是他的ViewModel的第二个窗口

Main View Model:
public class MainWindowViewModel
    {
        public Class1 C1 { get; set; } = new Class1("123");

        public MainWindowViewModel()
        {
            SensorEventList.Add(new UserControleSub(C1));

        }

        public ObservableCollection <UserControleSub> SensorEventList { get; set; } = new ObservableCollection<UserControleSub>();
    }

然后我将其传递给第二个窗口ViewModel构造函数

第二个窗口ViewModel构造函数:
 public partial class UserControleSub : UserControl
    {
        public UserControleSub(Class1 c1)
        {
            InitializeComponent();
            DataContext = new UserControleSubViewModel(c1);
        }
    }

第二个窗口ViewModel看起来像这样:

第二个窗口ViewModel:
 public class UserControleSubViewModel
    {
        public UserControleSubViewModel(Class1 c1)
        {
            C1 = c1;
        }
        public Class1 C1 { get; set; }
    }


及其XAML文件:

second window XAML:
<UserControl x:Class="WpfApp2.UserControleSub"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d" Height="450" Width="800">
    <Grid>
        <TextBlock Text="{Binding C1.X,UpdateSourceTrigger=PropertyChanged}" FontSize="30"></TextBlock>
    </Grid>
</UserControl>


策略是通过窗口构造函数将其传递给ViewModel构造函数,
这是一个好主意吗?它使ViewModel依赖于窗口,而第二个Window依赖于第一个窗口,这是一种不好的方式,对吗?
有更好的方法吗?
 
最佳 底部