0

私は C++ 開発者で、最近 C# に移行しました。wpf アプリで MVVM パターンを使用しています。私はラジオボタンの動的生成に取り組んでいます。要件は非常にシンプルです。一度に 1 つのラジオボタンのみがチェックされるように、24 個のラジオボタンを生成する必要があります。コードは次のとおりです。

XAML:

<Grid Grid.Row="1">
        <GroupBox Header="Daughter Cards" >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />                        
                    <ColumnDefinition Width="220" />
                </Grid.ColumnDefinitions>

                <Grid Grid.Column="0">
                    <RadioButton Content="{Binding SlotButtons}" Name="SLotButtons" />
                </Grid> 
            </Grid>
         </GroupBox>
</Grid>

上記で説明したように、Grid.Column="0"24個のラジオボタンを生成したいと考えています。

ビューモデル:

// Description of SlotButtons
    private string _SlotButtons;
    public string SlotButtons
    {
        get
        {
            return _SlotButtons;
        }

        set
        {
            _SlotButtons = value;
            OnPropertyChanged("SlotButtons");
        }
    }

//For RadioButton Click
private ICommand mSlotCommand;
    public ICommand SlotCommand
    {
        get
        {
            if (mSlotCommand == null)
                mSlotCommand = new DelegateCommand(new Action(mSlotCommandExecuted), new Func<bool>(mSlotCommandCanExecute));

            return mSlotCommand;
        }
        set
        {
            mSlotCommand = value;
        }
    }

    public bool mSlotCommandCanExecute()
    {
        return true;
    }

    public void mSlotCommandExecuted()
    {
       // Logic to implement on a specific radiobutton click using Index
    }

次のように、C++ アプリでこれを行いました。

for(slot = 0; slot < 24; slot++)
{
    m_slotButton[slot] = new ToggleButton(String(int(slot)) + String(": None"));
    m_slotButton[slot]->addButtonListener(this);  // make this panel grab the button press      
    addAndMakeVisible(m_slotButton[slot]);
}

これが私が達成したいことです:

  1. Content = 0: Noneまでのコンテンツを含む 24 個の RadioButton を生成します23: None
  2. ラジオボタンは、行を 3 列に分割し、各列に垂直方向に 8 つのラジオボタンを追加する方法で生成する必要があります。
  3. いつでも、1 つのラジオボタンのみをオンにする必要があり、他のボタンはオンにしないでください。それぞれのインデックスを使用してすべてのボタンを処理する 1 つのクリック コマンドのみが必要です。

助けてください :)

4

3 に答える 3

2

あなたはあなたを必要としませんSlotCommand。代わりにIsChecked、各ラジオボタンのプロパティをビューモデルのブールプロパティにバインドするだけです。

例:XAML:

<RadioButton Content="{Binding SlotButtons}" Margin="0,10,0,0" IsChecked="{Binding IsChecked}" GroupName="SlotGroup" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"/>

ViewModel:

public class SlotViewModel : ViewModelBase
{
    private _isChecked;

    public bool IsChecked
    {
        get { return _isChecked; }
        set { _isChecked = value; NotifyPropertyChanged("IsChecked"); }
    }
}

チェックされたときに何らかの反応をしたい場合は、IsCheckedセッターで実行してください。

于 2012-10-29T12:09:47.797 に答える
0

これが私がそれを達成した方法です:

XAML:

<Grid Grid.Column="0">
                    <ItemsControl ItemsSource="{Binding SlotChildren}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <UniformGrid Columns="3" Rows="8" />
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>

                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <RadioButton Content="{Binding SlotButtons}" Margin="0,10,0,0" Command="{Binding SlotCommand}" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Grid>     

ViewModel クラス:

public ObservableCollection<EEPROMSlotViewModel> SlotChildren { get; set; }

SlotChildren = new ObservableCollection<EEPROMSlotViewModel>();
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "0 : None", ID = 0 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "1 : None", ID = 1 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "2 : None", ID = 2 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "3 : None", ID = 3 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "4 : None", ID = 4 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "5 : None", ID = 5 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "6 : None", ID = 6 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "7 : None", ID = 7 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "8 : None", ID = 8 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "9 : None", ID = 9 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "10 : None", ID = 10 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "11 : None", ID = 11 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "12 : None", ID = 12 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "13 : None", ID = 13 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "14 : None", ID = 14 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "15: None", ID = 15 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "16 : None", ID = 16 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "17 : None", ID = 17 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "18 : None", ID = 18 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "19 : None", ID = 19 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "20 : None", ID = 20 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "21 : None", ID = 21 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "22 : None", ID = 22 });
        SlotChildren.Add(new EEPROMSlotViewModel() { SlotButtons = "23 : None", ID = 23 }); 

別の ViewModel クラス: XAML の DataContext は、この ViewModel クラスに設定されます

    /// <summary>
    /// Event for Slot Command Button
    /// </summary>
    private ICommand mSlotCommand;
    public ICommand SlotCommand
    {
        get
        {
            if (mSlotCommand == null)
                mSlotCommand = new DelegateCommand(new Action(mSlotCommandExecuted), new Func<bool>(mSlotCommandCanExecute));

            return mSlotCommand;
        }
        set
        {
            mSlotCommand = value;
        }
    }

    public bool mSlotCommandCanExecute()
    {
        return true;
    }

    public void mSlotCommandExecuted()
    {

    }

しかし、まだすべてのラジオボタンがチェックされています。それをクリアする方法は?

于 2012-10-29T10:52:10.630 に答える
0

ラジオ ボタンに明示的に「グループ名」を追加します。

<RadioButton GroupName="myGroup" Content="{Binding SlotButtons}" Margin="0,10,0,0" Command="{Binding SlotCommand}" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center" />

これにより、チェックできるラジオ ボタンは 1 つだけになります。

于 2013-03-18T10:30:00.180 に答える