通知已在WPF的UserControl中选择了单选按钮

问题描述 投票:0回答:1

我正在尝试使视图模型中的按钮识别出已选择另一个视图模型(在第一个视图模型上激活的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>
c# wpf caliburn.micro
1个回答
0
投票

[在寻找答案很长时间后,我决定最好寻找一个更好的解决方案,而不是一个答案。我发现ListBox元素具有SelectedItem属性,从而消除了对单选按钮的需要。最终,我用ListBox替换了ItemsControl,并对结果感到满意。

© www.soinside.com 2019 - 2024. All rights reserved.