Почему мой код работает так, как задумано, без DataContext и не работает, когда я добавляю DataContext? - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю UserControl с двумя кнопками (Hello и World), которые добавляют «Hello» и «World» к строке, которая отображается в TextBox.

Код в настоящее время работает как задумано, но только когда я не устанавливаю DataContext для UserControl. Как только я установил DataContext, кнопки больше не работают.

<UserControl x:Class="QualityAssuranceAssistance.Views.HomeView"
        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:QualityAssuranceAssistance.ViewModels;assembly=QualityAssuranceAssistance.ViewModels"
        mc:Ignorable="d"
        Height="420" Width="660">

    <UserControl.DataContext>
        <local:HomeViewModel/>
    </UserControl.DataContext>

    <Grid>
        <Button Content="{Binding HelloButton}"
                Command="{Binding ClickCommandLive}"
                CommandParameter="{Binding}"
                HorizontalAlignment="Left" 
                Margin="208,243,0,0" 
                VerticalAlignment="Top" 
                Width="75"/>
        <Button Content="{Binding WorldButton}"
                Command="{Binding ClickCommandTest}"
                CommandParameter="{Binding}"
                HorizontalAlignment="Left" 
                Margin="377,243,0,0" 
                VerticalAlignment="Top" 
                Width="75"/>
        <TextBox Text="{Binding StringViewModels, UpdateSourceTrigger=PropertyChanged}" 
                 HorizontalAlignment="Left" 
                 Margin="10,10,0,0" 
                 TextWrapping="Wrap" 
                 VerticalAlignment="Top" 
                 Height="56" 
                 Width="640"/>

    </Grid>
</UserControl>

Я думаю, что проблема как-то связана с конструктором. Когда я устанавливал DataContext, Visual Studio жаловалась, что в моем ViewModel нет доступных конструкторов. После некоторого поиска в Google я нашел кого-то, кто предложил добавить еще один конструктор без параметров. Я предполагаю, что по какой-то причине этот конструктор теперь используется для создания экземпляра ViewModel, поэтому команды в моем другом конструкторе не создаются.

        public HomeViewModel(List<IPageViewModel> viewModels)
        {
            ClickCommandLive = new RelayCommand(AddLivePages, CanExecute);
            ClickCommandTest = new RelayCommand(AddTestPages, CanExecute);
            _viewModels = viewModels;

        }

        public HomeViewModel() { }

Я ожидал, что мой код будет работать только при установленном DataContext и не будет работать, когда он не установлен. Вместо этого без DataContext он, кажется, работает, как я и ожидал, с установленным DataContext. Я все еще очень плохо знаком с WPF (и XAML) и C #, поэтому почти наверняка мне не хватает чего-то очень очевидного, но я не могу понять, что это такое.

...