[在寻找答案很长时间后,我决定最好寻找一个更好的解决方案,而不是一个答案。我发现ListBox元素具有SelectedItem属性,从而消除了对单选按钮的需要。最终,我用ListBox替换了ItemsControl,并对结果感到满意。
我正在尝试使视图模型中的按钮识别出已选择另一个视图模型(在第一个视图模型上激活的UserControl)中的单选按钮,从而启用了第一个视图模型中的按钮。我的基本视图模型AlbumsDisplayViewModel
中有一个UserControl BaseViewModel
。在BaseView
XAML中,有一个按钮(OpenAlbum),当选择了AlbumsDisplayView
上的单选按钮时,应该启用该按钮(请参阅CanOpenAlbum)。
BaseView XAML:
<Canvas x:Name="cnvsInputWrapper" Background="LightGray" Grid.Column="4" Grid.Row="1" Grid.RowSpan="4" Margin="5"> <Canvas.OpacityMask> <VisualBrush Visual="{Binding ElementName=maskRoundEdges}" /> </Canvas.OpacityMask> <DockPanel Margin="15, 25"> <ContentControl x:Name="ActiveItem" /> </DockPanel> </Canvas> <!-- Action Buttons section --> <Grid Grid.Row="3" Grid.Column="1" Grid.RowSpan="2"> <Grid.ColumnDefinitions> <ColumnDefinition Width="12" /> <ColumnDefinition Width="auto" /> <ColumnDefinition Width="auto" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="12" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="12" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="*" /> <RowDefinition Height="12" /> </Grid.RowDefinitions> <Button Grid.Row="1" Grid.Column="1" x:Name="OpenAlbum" IsEnabled="{Binding CanOpenAlbum}"> <StackPanel Orientation="Vertical"> <TextBlock>Open</TextBlock> <TextBlock>Album</TextBlock> </StackPanel> </Button> </Grid>
BaseViewModel C#:
public class BaseViewModel : Conductor<object> { private AlbumsDisplayViewModel m_vmAlbumsDisplay; // Initialized in another function. public BaseViewModel() { } public bool CanOpenAlbum() => (m_vmAlbumsDisplay != null) && (m_vmAlbumsDisplay.GetSelectedAlbum() != null); public void OpenAlbum() { AlbumModel album = m_vmAlbumsDisplay.GetSelectedAlbum(); //ActivateItem(/*albumViewModel(album)*/); } }
AlbumsDisplayView XAML:
<ItemsControl x:Name="Albums" FlowDirection="LeftToRight" Margin="10, 0"> <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type vms:AlbumViewModel}"> <StackPanel Orientation="Horizontal" Margin="0, 5"> <RadioButton GroupName="rdbtnAlbums" IsChecked="{Binding IsSelected}" /> <!-- Album Details --> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
AlbumsDisplayViewModel C#:
class AlbumsDisplayViewModel : Screen { private ObservableCollection<AlbumViewModel> m_albums; public AlbumsDisplayViewModel() { } public ObservableCollection<AlbumViewModel> Albums { get { return m_albums; } set { m_albums = value; NotifyOfPropertyChange(() => Albums); } } public AlbumModel GetSelectedAlbum() { AlbumModel res = null; foreach (var vmAlbum in Albums) { if (vmAlbum.IsSelected) { res = vmAlbum.Album; break; } } return res; } }
最后,AlbumViewModel C#:
class AlbumViewModel : Screen { private AlbumModel m_albumModel; private bool m_isSelected; public AlbumViewModel(AlbumModel albumModel) { m_albumModel = albumModel; } public AlbumModel Album { get { return m_albumModel; } set { m_albumModel = value; NotifyOfPropertyChange(() => Album); } } public bool IsSelected { get { return m_isSelected; } set { m_isSelected = value; NotifyOfPropertyChange(() => IsSelected); } } }
我希望当AlbumViewModel中的IsSelected发生更改时(当用户选择一个单选按钮时),OpenAlbum按钮将被启用,因为CanOpenAlbum将返回true,但是我意识到,由于某种原因,甚至都没有调用CanOpenAlbum。我需要怎么做,只要选择单选按钮,CanOpenAlbum就会被通知要调用?
我正在尝试使视图模型中的按钮识别出已选择另一个视图模型(在第一个视图模型上激活的UserControl)中的单选按钮,从而启用了...中的按钮。] >>
[在寻找答案很长时间后,我决定最好寻找一个更好的解决方案,而不是一个答案。我发现ListBox元素具有SelectedItem属性,从而消除了对单选按钮的需要。最终,我用ListBox替换了ItemsControl,并对结果感到满意。
AlbumDisplayView XAML(仅此更改):
<ScrollViewer x:Name="Scroller" Height="300"
FlowDirection="RightToLeft">
<ListBox x:Name="Albums" FlowDirection="LeftToRight"
Background="Transparent" Margin="10, 0"
BorderThickness="0" SelectedItem="{Binding SelectedAlbum}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type vms:AlbumViewModel}">
<StackPanel Orientation="Horizontal" Margin="0, 5">
<!-- Album Details -->
<StackPanel Orientation="Vertical">
<StackPanel Grid.Row="1" Grid.Column="1"
Orientation="Horizontal" Margin="12, 0">
<TextBlock Text="{Binding Album.Name}" />
<TextBlock Text=" - User@" />
<TextBlock Text="{Binding Album.OwnerID}" />
</StackPanel>
<TextBlock Text="{Binding Album.CreationDate}"
FontSize="12" Margin="12, 0" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
</ScrollViewer>
[在寻找答案很长时间后,我决定最好寻找一个更好的解决方案,而不是一个答案。我发现ListBox元素具有SelectedItem属性,从而消除了对单选按钮的需要。最终,我用ListBox替换了ItemsControl,并对结果感到满意。