получить доступ к данным вкладки из модели внешнего вида - PullRequest
0 голосов
/ 16 сентября 2018

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

enter image description here

Базовая структура у меня есть PriceViewModel.cs, PriceTab.xaml (usercontrol) и MainWindow.xaml.

В PriceViewModel.cs

public class PriceViewModel : PriceTabItem
{

    private string _PriceLevel;
    private bool _Buy;
    private bool _Sell;
    public string PriceLevel
    {
        get { return _PriceLevel; }
        set
        {
            _PriceLevel = value;
            OnPropertyChanged("PriceLevel");
        }
    }
    public bool Buy
    {
        get { return _Buy; }
        set
        {
            _Buy = value;
            OnPropertyChanged("Buy");
        }
    }
    public bool Sell
    {
        get { return _Sell; }
        set
        {
            _Sell = value;
            OnPropertyChanged("Sell");
        }
    }
    public PriceViewModel()
    {

    }

}

public abstract class PriceTabItem : PropertyChangedBase
{
    public string Title { get; set; }
    public string Header { get; set; }
    public string Content { get; set; }
}

public class PriceTabControl : PropertyChangedBase
{
    public ObservableCollection<PriceTabItem> Tabs { get; set; }
    private PriceTabItem _selectedTab;
    public PriceTabItem SelectedTab
    {
        get { return _selectedTab; }
        set
        {
            _selectedTab = value;
            OnPropertyChanged("SelectedTab");
        }
    }

    public Command AddNewTabCommand { get; set; }

    public PriceTabControl()
    {

        Tabs = new ObservableCollection<PriceTabItem>();
        AddNewTabCommand = new Command(AddNewTab);
    }
    private void AddNewTab()
    {
        var newtab = new PriceViewModel { Title = "Tab #" + (Tabs.Count + 1) };
        Tabs.Add(newtab);
        SelectedTab = newtab;
    }
}

In PriceTab.xaml:

    <UserControl x:Class="MyApp.PriceTab"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MyApp.ViewModels"
         mc:Ignorable="d" 
        d:DesignHeight="300" d:DesignWidth="700">
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:PriceViewModel}">

<Grid>
    <TextBox HorizontalAlignment="Left" Height="19" Text="{Binding PriceLevel}" Margin="101,155,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="81" RenderTransformOrigin="-0.177,0.286"/>
    <CheckBox Content="Buy" IsChecked="{Binding Buy}" HorizontalAlignment="Left" Height="20" Margin="16,109,0,0" VerticalAlignment="Top" Width="73"/>
    <CheckBox Content="Sell" IsChecked="{Binding Sell}" HorizontalAlignment="Left" Height="20" Margin="122,109,0,0" VerticalAlignment="Top" Width="73"/>

</Grid>

</DataTemplate>
</UserControl.Resources>
<DockPanel>

    <Button Command="{Binding AddNewTabCommand}" Content="AddNewTab"
            DockPanel.Dock="Bottom"/>

    <TabControl ItemsSource="{Binding Tabs}"
                SelectedItem="{Binding SelectedTab}"
                DisplayMemberPath="Title">
    </TabControl>
</DockPanel></UserControl>

In PriceTab.xaml.cs:

public partial class HistogramPriceTab : UserControl
{
    public HistogramPriceTab()
    {
        InitializeComponent();
        DataContext = new PriceTabControl();
    }
}

В MainWindow.xaml:

<Window x:Class="MyApp.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:MyApp"
    mc:Ignorable="d"
    Title="MainWindow" Height="550" Width="850">

    <Grid Width="Auto" Height="Auto">
        <Button Name="SaveButton" Content="Save" HorizontalAlignment="Left" Height="33.16" Margin="701.5,11,0,0" VerticalAlignment="Top" Width="88.5" Click="SaveButton_Click"/>

        <TabControl HorizontalAlignment="Left" Height="485" Margin="-7,28,0,-7.6" VerticalAlignment="Top" Width="850" >
            <TabItem>
                <local:OtherTabs></local:OtherTabs>
            </TabItem>
            <TabItem Name="Price" Header="Price">
                <Grid Background="#FFE5E5E5">
                    <local:PriceTab></local:PriceTab>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                    <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                    <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                    <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                    <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                   <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>
            <TabItem>
                <Grid Background="#FFE5E5E5">
                    <local:OtherTabs></local:OtherTabs>
                </Grid>
            </TabItem>

        </TabControl>
    </Grid></Window>

Так что в правом верхнем углу у меня есть кнопка «Сохранить», при нажатии на которую она должна будет получить все входные данные из вкладок, выполнить некоторые расчеты и графики на их основе и перейти к следующему окну. Поэтому я хочу, чтобы следующее окно могло ссылаться на все входные данные из этого окна. Как мне подойти к этому с рисунком? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Разобрался потом, чтобы сослаться на вкладки и все элементы внутри, Посмотрите код ниже, мы можем получить доступ к текстовому полю Уровень цен (как пример), используя файл xaml для доступа к дочерним элементам.

 var pricetabs = (((this.Price.Content as Grid).Children[0] as PriceTab).DataContext as ViewModels.PriceTabControl).Tabs;
 String res = "";
 foreach (ViewModels.PriceViewModel v in pricetabs)
 {
     res += v.PriceLevel.ToString()
 }

Честно говоря, не уверен, что это правильный способ сделать это, или если он побеждает структуру mvvm, но он делает свою работу!

0 голосов
/ 18 сентября 2018

Трудная запись xaml не позволяет вам динамически создавать свои вкладки.

Вы должны рассмотреть возможность создания своих вкладок, используя ItemControl с его itemSouce, связывающим со списком ваших моделей представления вкладок в вашей ценовой модели.Взгляните на этот учебник о itemcontrol

Таким образом, когда вы хотите заняться бизнесом, требующим информацию обо всех вкладках, вы можете получить к ним доступ через список tabsviewmodels

...