我有一個具有ListBox列表框的應用程序。我想使InnerList框互斥。我的ViewModel有一個集合Foos,它有一個描述,一個IsSelected屬性和一個集合Bars,它們有一個名字和IsSelected屬性。WPF互斥列表框
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的一部分。此ListBox的ItemsSource屬性使用ItemsSource={Binding Path=Foos}
綁定,並且在此ListBox的模板中是一個內部ListBox,它使用ItemsSource="{Binding Path=Bars}"
綁定。 A,B和C是Foos的描述。其中包含的項目是酒吧名稱。
|--------------------------|
| A |--------------------| |
| | Item 1 | |
| | Item 2 | |
| | Item 3 | |
| |--------------------| |
| |
| B |--------------------| |
| | Item X | |
| | Item Y | |
| | Item Z | |
| |--------------------| |
| |
| C |--------------------| |
| | Item l | |
| | Item m | |
| |--------------------| |
|--------------------------|
我需要這樣做,因此用戶只能從任何酒吧中選擇一個項目。因此,如果用戶從Foo A中選擇Item 1,然後從Foo B中選擇Item X,則應取消選擇Item 1。
我還需要將選定的項目綁定到窗口上其他位置的TextBox控件,但是我認爲這是一次。
在代碼和選擇更改事件中執行此操作不是一種選擇。我寧願只使用XAML來保存它。
在此先感謝。
UPDATE
繼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>
我遇到過的一個問題是,如果列表框的SelectedItem屬性綁定到一個屬性,並且屬性帶有一個不在列表中的值,那麼它不會導致所選項目在視覺上被取消選擇。我最終通過修改SelectedObject ViewModel屬性的setter來解決這個問題,以便在更新之間產生一個更改爲'null'的通知屬性。這將正確地導致列表框取消選擇。 – 2010-11-27 20:01:06