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

あなたListBox.ItemsSourceは にバインドされていObservableCollection<ScreensManager>ます。つまり、あなたにはオブジェクトListBoxのコレクションが含まれていますが、タイプはです。bool オブジェクトがオブジェクトと等しくなることはないため、が に見つからないため、WPF は何も選択しません。ScreensManagerSelectedItemboolScreensManagerSelectedItemItemsSource

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 に答える