Уведомление о том, что RadioButton был выбран в UserControl в WPF - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь заставить кнопку в модели представления распознавать, что была выбрана радиокнопка в другой модели представления (UserControl, который активируется в первой модели представления), таким образом, активируя кнопку в первой модели представления. У меня есть UserControl AlbumsDisplayViewModel в моей базовой модели 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);
            }
        }
   }

Я ожидал, что когда IsSelected в AlbumViewModel изменяется (когда пользователь выбирает переключатель), кнопка OpenAlbum будет включена, потому что CanOpenAlbum вернет true, но я понял, что CanOpenAlbum даже не был позвонил по какой-то причине. Что мне нужно сделать, чтобы CanOpenAlbum получал уведомление о вызове при выборе радиокнопки?

1 Ответ

0 голосов
/ 07 апреля 2020

После долгого поиска ответа я решил, что будет лучше искать лучшее решение, чем ответ. Я обнаружил, что элемент ListBox имеет свойство SelectedItem, которое устраняет необходимость в переключателях. В конце концов я заменил ItemsControl на ListBox, и я доволен результатами.

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>
...