У меня есть элемент управления ListView, который представляет список пользователей на основе их позиций. ItemSource
для ListView привязано к списку пользователей в ViewModel.
<UserControl
x:Class="Views.UserPositionView"
d:DataContext="{d:DesignInstance viewModels:UserPositionViewModel, IsDesignTimeCreatable=True}">
<ListView
ItemsSource="{Binding UserPositions}">
<ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<!-- What to bind here? -->
<Setter Property="IsHitTestVisible" Value="{Binding ElementName=UserButton Path=IsEnabled}"/>
</ListView.ItemContainerStyle>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Button Name="UserButton"
IsEnabled="{Binding IsPresent} />
</DataTemplate>
</ListView>
Это класс ViewModel (упрощенно).
//ViewModel definition
public class UserPositionViewModel: ViewModelBase {
private readonly Dictionary<int, UserViewModel> m_users =
new Dictionary<int, UserViewModel>();
public IEnumerable<UserViewModel> UserPositions { get { return m_users.Values; } }
}
public class UserViewModel: ViewModelBase {
private bool m_isPresent;
public bool IsPresent {get; set {Set(()=> IsPresent, ref m_isPresent, value);}
}
Однако у меня возникают проблемы с привязкой свойства IsHitTestVisible
в ListView.ItemContainerStyle
. По сути, я хотел бы связать его со свойством IsPresent
каждой UserViewModel в UserPositions. Я подумал, что это невозможно, потому что ListView.ItemContainerStyle
- это корневые элементы ListView. Я пытался привязать его к имени элемента кнопки, но это тоже не сработало. Я получаю эту ошибку:
Cannot find source for binding with reference 'ElementName=UserButton '. BindingExpression:Path=IsEnabled; DataItem=null; target element is 'ListViewItem' (Name='');
Какой лучший способ подойти к этому? В идеале я хотел бы иметь доступ к каждому UserViewModel
в <ListView.ItemContainerStyle>
.