Если вы используете модель MVVM, вы можете добавить дополнительные IsSelected
свойства к своим предметам, которые вы связываете с ListBox
:
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
RaisePropertyChanged();
}
}
На модели представления страницы добавить SelectedItem
свойство, которое установит IsSelected
всем пунктам правильно:
public Item SelectedItem
{
get { return _selectedItem; }
set
{
if (_selectedItem != value)
{
if (_selectedItem != null)
{
_selectedItem.IsSelected = false;
}
if (value != null)
{
value.IsSelected = true;
}
_selectedItem = value;
RaisePropertyChanged();
}
}
}
Теперь необходимо связать эти два свойства:
<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<Button Content="Click Me" Visibility="{Binding IsSelected, Converter={StaticResource VisibilityConverter}}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Вам также нужен конвертер для преобразования значения bool
в Visibility
:
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is bool)
{
return (bool) value ? Visibility.Visible : Visibility.Collapsed;
}
else
{
return Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new System.NotImplementedException();
}
}
Объявить его как статический ресурс на странице:
<Page.Resources>
<local:VisibilityConverter x:Key="VisibilityConverter" />
</Page.Resources>
Без шаблона MVVM Вам лучше всего с помощью Cimbalino multibinding behavior. Первая ссылка Cimbalino Toolkit.Затем вы можете настроить MultiBinding в XAML:
<ListBox ItemsSource="{Binding Items}" x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<Button Content="Click Me">
<interactivity:Interaction.Behaviors>
<behaviors:MultiBindingBehavior PropertyName="Visibility" Converter="{StaticResource VisibilityMultiConverter}">
<behaviors:MultiBindingItem Value="{Binding}"/>
<behaviors:MultiBindingItem Value="{Binding SelectedItem, ElementName=MyListBox}"/>
</behaviors:MultiBindingBehavior>
</interactivity:Interaction.Behaviors>
</Button>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
Опять вам нужен конвертер, который проверяет, является ли элемент выбран в данный момент:
public class VisibilityMultiConverter : MultiValueConverterBase
{
public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0] != null && values[0] == values[1] ? Visibility.Visible : Visibility.Collapsed;
}
public override object[] ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
И добавить конвертер в качестве страницы ресурса:
<Page.Resources>
<local:VisibilityMultiConverter x:Key="VisibilityMultiConverter" />
</Page.Resources>
Вы используете MVVM? –