Передача параметра из другой VM

Рейтинг: 0Ответов: 0Опубликовано: 17.07.2023

В общем есть некоторый список:

    private ObservableCollection<SiteConfig> _sites;

    public ObservableCollection<SiteConfig> Sites
    {
        get => _sites;
        set => Set(ref _sites, value);
    }

Он находится в основной MainWindnowVM и привязан к одному TabItem. Также есть другой TabItem для регистрации нового элемента в списке сайтов, который находится в другой NewSiteVM. Проблема в том, что не знаю как передать данный список из MainWindnowVM в NewSiteVM, чтобы добавить новую запись при срабатывании команды.

DataContext объявил вот так, не знаю данное объявление нарушает принципы MVVM, но мне было так удобнее, нежеле в XAML

    public MainWindow()
    {
        InitializeComponent();
        AllSitesTabItem.DataContext = new MainWindnowVM();
        CreateNewPasswordTabItem.DataContext = new NewSiteVM();
    }

AllSitesTabItem и CreateNewPasswordTabItem - имена TabItem-ов.

Была идея сделать данный список статичным, но думаю это быдет лишь костыль и не знаю можно ли будет потом его связать с DataGrid.

Вся разметка:

<Window x:Class="PWManager.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:col="clr-namespace:System.Collections;assembly=mscorlib"
    mc:Ignorable="d"
    Title="PasswordsManager" Height="600" Width="800">
<Grid>

    <TabControl x:Name="TabControl" SelectedIndex="{Binding SelectedTabItem}">
        <TabItem x:Name="AllSitesTabItem" Header="Мои пароли">
            <Grid>

                <Grid.RowDefinitions>
                    <RowDefinition Height="0.85*"/>
                    <RowDefinition Height="0.15*"/>
                </Grid.RowDefinitions>

                <DataGrid Grid.Row="0" AutoGenerateColumns="False" 
                          Margin="10" Padding="5" ItemsSource="{Binding Path=Sites}" 
                          IsReadOnly="True">
             
                    <DataGrid.Columns>
                        <DataGridHyperlinkColumn Header="Название" Binding="{Binding Path=SiteUsl}" 
                                                 ContentBinding="{Binding Path=SiteName}">
                            <DataGridHyperlinkColumn.ElementStyle>
                                <Style TargetType="TextBlock">
                                    <EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick"/>
                                </Style>    
                            </DataGridHyperlinkColumn.ElementStyle>
                        </DataGridHyperlinkColumn>
                        <DataGridTextColumn Header="Дата регистрации" Binding="{Binding Path=RegisteDate}"/>
                    </DataGrid.Columns>

                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="10">
                                <TextBlock Text="Пароль: "/>
                                <TextBlock Text="{Binding Path=SitePassword}" Margin="0, 0, 10, 0"/>
                                <TextBlock Text="Последнее изменение: "/>
                                <TextBlock Text="{Binding Path=DateLastChange}"/>
                            </StackPanel>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>

                </DataGrid>

                    <Button Grid.Row="1" Content="Создать новый пароль" 
                        Height="50" Margin="10" Command="{Binding Path=NewSiteClick}"/>
            </Grid>
            
        </TabItem>
        <TabItem x:Name="CreateNewPasswordTabItem" Header="Новый пароль">

            <StackPanel Orientation="Vertical" Margin="10">
                <TextBlock Text="Название Сайта" Margin="10, 20, 0, 15" FontSize="17"/>
                <TextBox Margin="10, 0, 10, 0" Text="{Binding Path=SiteName}"/>

                <TextBlock Text="Пароль" Margin="10, 15, 0, 15" FontSize="17"/>
                <TextBox Margin="10, 0, 10, 0" Text="{Binding Path=Password}"/>

                <TextBlock Text="Повторно пароль" Margin="10, 15, 0, 15" FontSize="17"/>
                <TextBox Margin="10, 0, 10, 0" Text="{Binding Path=PasswordAgain}"/>
                <TextBlock Text="" Margin="10"/>

                <TextBlock Text="Ссылка на сайт" Margin="10, 15, 0, 15" FontSize="17"/>
                <TextBox Margin="10, 0, 10, 20" Text="{Binding Path=Uri}"/>

                <Button Content="Добавить" Margin="10" Height="50"
                    Command="{Binding Path=NewSiteClick}" />

            </StackPanel>

        </TabItem>
    </TabControl>

</Grid>

Ответы

Ответов пока нет.