Передача данных между двумя usercontrols / Views - PullRequest
1 голос
/ 02 апреля 2020

Использование MVVM

Я пытаюсь передать данные, введенные в элемент управления (текстовое поле в прилагаемом коде), в одном представлении (view1) и использовать эти данные во втором представлении (view2). На данный момент, объявив все мои представления в файле App.xaml , я могу связать текстовый блок в view2 с информацией, введенной в текстовое поле в view1, и увидеть его в указанном текстовом блоке. Но я хочу использовать информацию, введенную в модель представления view2, но не знаю, как получить к ней доступ, чтобы использовать эту информацию.

Может кто-нибудь сказать мне, как go об этом? Спасибо!

App.xaml [декларация ресурсов]

<Application.Resources>
<vws:DefaultVM x:Key="DefaultVMApp"></vws:DefaultVM>
<vws:View1 x:Key="View1App"></vws:View1>
<vws:View2 x:Key="View2App"></vws:View2>
<vm:AppVM x:Key="AppVMApp"></vm:AppVM>
<vm:View1VM x:Key="View1VMApp"></vm:View1VM>
<vm:View2VM x:Key="View2VMApp"></vm:View2VM>
</Application.Resources>

View1.xaml

    <UserControl.DataContext>
    <StaticResource ResourceKey="View1VMApp"></StaticResource>
    </UserControl.DataContext>
    <Grid Background="Aqua">
    <StackPanel Margin="100">
    <TextBox x:Name="firstNameTextBoxView1" Text="{Binding View1InfoClass.FirstName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"></TextBox>           
    <Button Command="{Binding Source={StaticResource AppVMApp}, Path=View2ButtonCommand}"  Content="Go to view2" Height="20" Width="70" />
    </StackPanel>
</Grid>

View2.xaml

<UserControl.DataContext>
        <StaticResource ResourceKey="View2VMApp"></StaticResource>
    </UserControl.DataContext>
    <Grid Background="Beige">
        <StackPanel Margin="100">

            <TextBlock x:Name="View1TextBlock" Text="{Binding Source={StaticResource View1VMApp}, Path=View1InfoClass.FirstName}" ></TextBlock>

        </StackPanel>
    </Grid>

AppVM

    public class AppVM : ObservableObject
        {
            //Create a property that controls current view
            private static object _currentView =  new DefaultVM();
            public object CurrentView
            {
                get { return _currentView; }
                private set
                {
                    OnPropertyChanged(ref _currentView, value);
                }
            }
            private string _textboxText;
            public string TextboxText
            {
                get { return _textboxText; }
                set
                {
                    OnPropertyChanged(ref _textboxText, value);
                }
            }
            public AppVM()
            {
                View1ButtonCommand = new RelayCommand(ShowView1, AlwaysTrueCommand);
                View2ButtonCommand = new RelayCommand(ShowView2, AlwaysTrueCommand);
                DefaultCommand = new RelayCommand(ShowDefault, AlwaysTrueCommand);  
            }
//Instantiate the relaycommands, we will need to instantiate relaycommand objects for every command we need to perform. 
            //This means that we will need to do this for preses of all buttons
            public RelayCommand View1ButtonCommand { get; private set; }
            public RelayCommand View2ButtonCommand { get; private set; }

            public RelayCommand DefaultCommand { get; private set; }


            public void ShowDefault(object dummy)
            {
                CurrentView = new DefaultVM();
            }

            public void ShowView1(object dummy)
            {
                CurrentView = new View1();
            }

            public void ShowView2(object dummy)
            {  
                CurrentView =  new View2();
            }

            public bool AlwaysTrueCommand(object dummy)
            {
                return true;
            }
        }

View1 and View2 layout, kind of TLDR

1 Ответ

1 голос
/ 02 апреля 2020

Основная проблема в вашем коде заключается в том, что вы выделили предварительно определенный объект модели представления каждому из пользовательских элементов управления. Это действительно плохо. Контекст данных пользовательского элемента управления должен быть оставлен в покое, чтобы клиентский код (например, ваше главное окно) мог определить и использовать для привязки к специфицированным c свойствам, которые предоставляет пользовательский элемент управления.

К сожалению, в вашем вопросе недостаточно контекста, чтобы дать четкий и полный ответ. Но чтобы решить вашу проблему, вам нужно сделать что-то по-другому:

  1. Прежде всего, «отделите» модели представлений, которые вы используете для своего пользовательского элемента управления, от самих пользовательских элементов управления. Сделайте это, добавив свойства зависимостей к каждому пользовательскому элементу управления, а затем разрешив основному представлению, в котором используются пользовательские элементы управления, решить, что связывать с каждым из этих свойств зависимостей. не позволяет пользовательским элементам управления самим устанавливать свои собственные контексты данных.
  2. Сделав это, вы можете обнаружить, что можете использовать ту же модель представления для двух пользовательских элементов управления, что и для основной вид. Т.е. вы устанавливаете контекст данных основного представления на модель единого представления, пользовательские элементы управления наследуют этот контекст данных, и вы будете связывать, например, свойство TextboxText с соответствующим объявленным свойством зависимости в каждом пользовательском элементе управления. Таким образом, это единственное свойство будет представлять состояние для обоих пользовательских элементов управления одновременно.

Можно надеяться, что этого будет достаточно, чтобы вернуть вас в нужное русло. Если нет, попробуйте поискать переполнение стека для других вопросов, связанных с моделями представления и их отношениями к пользовательским элементам управления. Например, эти вопросы: Проблема с привязкой DependencyProperty XAML-привязка не работает со свойством зависимости? Связывание данных WPF с MVVM и пользовательскими элементами управления

Другие вопросы, которые не совсем точно касаются вашего сценария, но которые должны дать вам некоторые идеи об альтернативных способах структурирования ваших моделей представления: MVVM: обмен данными между ViewModels Обмен данными, не относящимися к управлению, между WPF ViewModel и UserControl Обмен данными между различными моделями представления Состояние обмена между ViewModels

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...