Передача параметра из другой VM
В общем есть некоторый список:
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>
Источник: Stack Overflow на русском