0

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

以下是我的资源目录下的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>

以下是viewmodel.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 来说是全新的,请有人帮我解决我的问题..提前致谢。

4

2 回答 2

1

SelectedScreen是类型的bool,应该是类型的ScreensManager

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

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

ScreenManager.SelectedScreen = ScreenCollection.FirstOrDefault(); // Works
ScreenManager.SelectedScreen = new ScreensManager() { ... }; // Won't work
于 2012-08-20T13:53:05.480 回答
0

确保绑定处于双向模式:

SelectedItem="{Binding Path=ScreenManager.SelectedScreen, Mode=TwoWay}"
于 2012-08-20T13:30:35.497 回答