Привязка ListView работает из коробки, тогда как пользовательская реализация не? - PullRequest
0 голосов
/ 03 декабря 2018

Я вернулся к старому проекту и хотел обновить код.У меня была эта реализация, которая работала хорошо:

<ListView
         Background="{StaticResource  WindowBackgroundColorBrush}"
         ItemsSource="{Binding ListOfProjects}"
         SelectedItem="{Binding SelectedProject, Mode=TwoWay}">
</ListView>

Я решил переписать ее как набор кнопок по причине, поэтому я изменил выше:

<ItemsControl ItemsSource="{Binding ListOfProjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Style="{ StaticResource ProjectListButtonStyle}" Content="{Binding Name}"                                    
                    Command="{Binding ElementName=ContainerContent, Path=DataContext.ProjectSelectedCommand}"
                    CommandParameter="{Binding ID}"
            />
        </DataTemplate>
    </ItemsControl.ItemTemplate>                                
</ItemsControl>

Я создалКоманда ProjectSelectedCommand, которая была просто реализована как:

this.ProjectSelectedCommand = new RelayCommand(x => this.OnProjectsSelected((int)x));

public void OnProjectsSelected(int projectID)
{
    this.SelectedProject = this.ListOfProjects.Where(x => x.ID == projectID).First();
}

Но в результате привязка не работает.У меня есть простой текстовый блок для отображения названия проекта:

<TextBlock Text="{Binding Path=SelectedProject.Name}"></TextBlock>

В первой реализации имя проекта изменяется, а во второй (с помощью кнопок и команды) это не происходит, когда я нажимаюкнопка проекта.Я вижу, что отладчик входит в команду, и в ViewModel я вижу изменение SelectedProject, но представление не обновляет его.Кто-нибудь знает, что может быть проблема второй реализации?

1 Ответ

0 голосов
/ 03 декабря 2018

Хорошо, похоже, проблема заключалась в привязке кнопки.Я использовал ElementName и ссылался на контейнер динамического содержимого, который есть в моем приложении WPF, для изменения представлений ViewModel.Чтобы исправить это, я просто добавил общий FindAncestor, и теперь он, кажется, работает:

<Button Style="{ StaticResource ProjectListButtonStyle}"
    Content="{Binding Name}"                                    
    Command="{Binding Path=DataContext.ProjectSelectedCommand,
              RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"
    CommandParameter="{Binding}"
/>

Странно то, что раньше я видел, что это входит в метод OnProjectSelected, но представление неполучить уведомление.Возможно, возникла проблема с контекстом ElementName, так как в моем случае он меняется во время выполнения.В любом случае, похоже, что вышеизложенное устраняет проблему.

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