无法获取,请从包含wpf MVVM中动态生成的单选按钮的列表框中设置selectedItem



我正在尝试用动态单选按钮填充列表框,这些按钮被自定义为切换按钮。如上所述,我可以用单选按钮填充列表框项目。但是,一旦我们选择了任何一个单选按钮,在调试时就无法从我的视图模型对象中的单选按钮列表中设置所选项目。

以下是我的资源目录中的xaml代码

 <Style x:Key="ScreensList" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <RadioButton
                               VerticalAlignment="Center" GroupName="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
                                IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}">
                                    <RadioButton.Template>
                                        <ControlTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <ToggleButton  IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
                                                    <StackPanel Width="80" Height="60" Orientation="Vertical" HorizontalAlignment="Left" Margin="10,10,20,10">
                                                        <Image Source="Default.png" Height="40"></Image>
                                                        <TextBlock Text="{Binding Path=ScreenNumber}" FontSize="11"></TextBlock>
                                                    </StackPanel>
                                                </ToggleButton>
                                            </StackPanel>
                                        </ControlTemplate>
                                    </RadioButton.Template>
                                </RadioButton>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

下面是我在xaml页面中的xaml代码

 <ListBox x:Name="ScreensList" ItemsSource="{Binding ScreenCollection}" 
                SelectedItem="{Binding Path=ScreenManager}" 
                  Style="{StaticResource ScreensList}" Width="365">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel FlowDirection="LeftToRight"  Orientation="Horizontal" >
                    </WrapPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

以下是视图模型.cs

   public ObservableCollection<ScreensManager> ScreenCollection { get; set; }

    private ScreensManager _screenManager;
    public ScreensManager ScreenManager
    {
        get { return _screenManager; }
        set
        {
            if (_screenManager != value)
            {
                if (_screenManager != null)
                {
                    _screenManager = value;

                }
            }
        }
    }
 private void AddScreens()
    {
        int screenCount = Screen.AllScreens.Length;
        if (ScreenCollection == null)
            ScreenCollection = new ObservableCollection<ScreensManager>();
        for (int screenCounter = 1; screenCounter <= screenCount; screenCounter++)
        {
           if (screenCounter == 1)
           { 
            _screenManager = new ScreensManager();
            _screenManager.ScreenNumber = screenCounter;
            ScreenCollection.Add(_screenManager);
           }
        }
    }

以下是我的ScreenManager.cs模型类文件中的代码

 public ScreensManager()
   {
   }
   private int _screenNumber;
   public int ScreenNumber
   {
       get { return _screenNumber; }
       set
       {
           _screenNumber = value;
           OnPropertyChanged("ScreenNumber");
       }
   }
   private bool _selectedScreen;
   public bool SelectedScreen
   {
       get { return _selectedScreen; }
       set
       {
           if (_selectedScreen = value)
           {
               _selectedScreen = value;
               if (_selectedScreen != value)
               {
                   OnPropertyChanged("SelectedScreen");
               }
           }
       }
   }

    private void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    public event PropertyChangedEventHandler PropertyChanged;

我无法找到我真正出错的地方,因为我对mvvm完全陌生,请有人帮我解决我的问题。。提前谢谢。

您的SelectedScreen属于bool类型,并且应该属于ScreensManager 类型

您的ListBox.ItemsSource绑定到ObservableCollection<ScreensManager>,这意味着您的ListBox包含ScreensManager对象的集合,但是SelectedItem的类型是bool。bool对象永远不等于ScreensManager对象,因此WPF不会选择任何内容,因为在ItemsSource中找不到SelectedItem

SelectedScreen类型更改为ScreensManager而不是bool,并确保它等于ScreenCollection中存在的项目。WPF通过引用而不是值来比较对象,因此

ScreenManager.SelectedScreen = ScreenCollection.FirstOrDefault(); // Works
ScreenManager.SelectedScreen = new ScreensManager() { ... }; // Won't work

确保绑定处于双向模式:

SelectedItem="{Binding Path=ScreenManager.SelectedScreen, Mode=TwoWay}"

最新更新