У меня есть приложение, в котором есть ListBox of ListBoxes.Я хотел бы сделать коробки InnerList взаимоисключающими.Мой ViewModel имеет коллекцию Foos, у которой есть описание, свойство IsSelected и панели коллекций, которые имеют имя и свойство IsSelected.
public class MyViewModel : INotifyPropertyChanged
{
public ObservableCollection<Foo> Foos { /* code removed for brevity */ }
}
public class Foo : INotifyPropertyChanged
{
public string Description { /* code removed for brevity */ }
public ObservableCollection<Bar> Bars { /* code removed for brevity */ }
public bool IsSelected { /* code removed for brevity */ }
}
public class Bar : INotifyPropertyChanged
{
public string Name { /* code removed for brevity */ }
public bool IsSelected { /* code removed for brevity */ }
}
Ниже приведена часть моего MainWindow, для которого DataContext имеет значение MyViewModel.Свойство ItemsSource этого ListBox связано с использованием ItemsSource={Binding Path=Foos}
, а в шаблоне для этого ListBox есть внутренний ListBox, который связан с использованием ItemsSource="{Binding Path=Bars}"
.A, B и C - описания Фуса.Элементы, содержащиеся в них, - это имена баров.
|--------------------------|
| A |--------------------| |
| | Item 1 | |
| | Item 2 | |
| | Item 3 | |
| |--------------------| |
| |
| B |--------------------| |
| | Item X | |
| | Item Y | |
| | Item Z | |
| |--------------------| |
| |
| C |--------------------| |
| | Item l | |
| | Item m | |
| |--------------------| |
|--------------------------|
Мне нужно сделать так, чтобы пользователь мог выбрать только один элемент из любого из баров.Таким образом, если пользователь выбирает элемент 1 из Foo A, а затем выбирает элемент X из Foo B, то элемент 1 должен быть отменен.
Мне также нужно привязать выбранный элемент к элементу управления TextBox в другом месте окна, но я полагаю, 1 вещь за раз.
Делать это в коде и выбирать измененные события нельзя.Я бы предпочел сохранить это, используя только XAML.
Заранее спасибо.
ОБНОВЛЕНИЕ Следуя совету Moonshield, я придумал это, но оно все еще не работает полностью.
public class MyViewModel
{
private Bar _selectedBar;
public ObservableCollection<Foo> Foos { /* code removed for brevity */ }
public Bar SelectedBar
{
get { return _selectedBar; }
set
{
_selectedBar = null;
NotifyPropertyChanged("SelectedBar");
_selectedBar = value;
NotifyPropertyChanged("SelectedBar");
}
}
}
<ListBox x:Name="lbFoos" ItemsSource="{Binding Path=Foos}" SelectedItem="{Binding Path=SelectedBar}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<StackPanel>
<TextBlock Text="Foo: " />
<TextBlock Text="{Binding Path=Description}" />
<ListBox ItemsSource="{Binding Path=Bars}" SelectedItem="{Binding Path=SelectedItem RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBox}}}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<TextBlock Text="{Binding Path=Name}" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=OneWayToSource}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>