1

私はWPFアプリに取り組んでおり、最初に4つのラジオボタンを生成する必要があります。それが完了したら、ボタンをクリックするたびにテキストボックスとラベルを生成する必要があります。

  • 異なる4つのラジオボタンを生成するContent
  • 各ボタンをクリックすると、クリックしたボタンに基づいて異なる8つのラベルが生成Contentされ、各ラベルに8つのテキストボックスが関連付けられるように読み取り専用の64のテキストボックスが生成されます。つまり、8 x 8

私は次のようにそれを行うことによってある程度成功しています:

XAML:

xamlでは、グリッドを2行に分割しました。最初の行には4つのラジオボタンがあります。2番目の行は2つの列に分割され、1番目の列には8つの動的ラベルがあり、2番目の列には64のテキストボックスがあります。つまり、各行に8つあります。

<Grid Grid.Row="0">                     

        <ItemsControl ItemsSource="{Binding Children}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" >
                        <RadioButton Content="{Binding RadioBase}" Margin="0,10,0,0" IsChecked="{Binding BaseCheck}" GroupName="SlotGroup" />                            
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <Button Content="Refresh Regs" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1" Margin="0" Width="100" Height="25" />
    </Grid>

<Grid Grid.Row="1">            

        <ItemsControl ItemsSource="{Binding Children}" Grid.Column="0">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <ItemsControl Visibility="{Binding IsRegisterItemsVisible, Converter={StaticResource BoolToVisibilityConv}}" ItemsSource="{Binding RegisterLabels}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="50,20,0,0">
                                        <TextBlock Text="{Binding}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

        <ItemsControl ItemsSource="{Binding Children}" Grid.Column="1">
            // Textbox here
        </ItemsControl>
    </Grid>

FPGARadioWidgetViewModelクラス:このクラスのDataContextはここで設定されます

public ObservableCollection<FPGAViewModel> Children { get; set; }

    public FPGARadioWidgetViewModel()
    {
        Children = new ObservableCollection<FPGAViewModel>();
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x0", ID = 0 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x40", ID = 1 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x80", ID = 2 });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0xc0", ID = 3 });            
    }

FPGAViewModelクラス:

private bool sBaseCheck;
    public bool BaseCheck
    {
        get { return this.sBaseCheck; }
        set
        {
            this.sBaseCheck = value;
            Generatelabels(this, ID);
            this.OnPropertyChanged("BaseCheck");
        }
    }

    private static void Generatelabels(FPGAViewModel currentItem, int index)
    {
        int m_baseRegister = 0;

        if (index == 0)
        {                
            for (int i = 0; i < 0x40 / 8; i++)
            {
                int reg = (i * 8) + m_baseRegister;
                currentItem.RegisterLabels[i] = "Reg 0x" + reg.ToString("X");
                currentItem.IsRegisterItemsVisible = true;
            }
        }
        else if (index == 1)
        {
            m_baseRegister = 0x40 * index;
            for (int i = 0; i < 0x40 / 8; i++)
            {
                int reg = (i * 8) + m_baseRegister;
                currentItem.RegisterLabels[i] = "Reg 0x" + reg.ToString("X");
                currentItem.IsRegisterItemsVisible = true;
            }
        }
        // Similarly for Index 2 and Index = 3
    }

    private string[] registerLabels = new string[8];
    public string[] RegisterLabels { get { return registerLabels; } }

    private bool isRegisterItemsVisible = false;
    public bool IsRegisterItemsVisible
    {
        get { return isRegisterItemsVisible; }
        set
        {
            isRegisterItemsVisible = value;
            OnPropertyChanged("IsRegisterItemsVisible");
            OnPropertyChanged("RegisterLabels");
        }
    }        

    private string _RadioBase;
    public string RadioBase
    {
        get; set;
    }

    private int _ID;
    public int ID
    {
        get; set;
    }

したがって、上記のviewmodelクラスに気付いた場合、Indexによってラジオボタンがクリックされ、計算に基づいてさまざまな値のラベルを生成できます。16進変換が行われます。

要件は次のとおりです。

  • ラジオボタンをクリックすると、ラベルが表示されますが、Grid.Column="0"それに応じてテキストボックスも配置されます。前述のように、ボタンをクリックするたびに64個のボックスが表示され、ラベルごとに8個表示されます。テキストボックスはに表示される必要がありますGrid.Column="1"

  • ラジボタンをクリックすると、ラベルが表示されます。[次へ]ボタンをクリックすると、ラベルが再び表示されます。ただし、以前に表示されたラベルはクリアされません。新しいラベルを表示する前にクリアしたい。

  • 起動時に、最初のラジオボタンをチェックし、関連するラベル+テキストボックスを表示する必要があります。

テキストボックスを作成できたC++で行ったサンプルコード:

for(i = 0; i < 0x40; i++)
{
    m_registerGetValue[i] = new TextEditor();
    m_registerGetValue[i]->setReadOnly(true);
    addAndMakeVisible(m_registerGetValue[i]);
}

スクリーンショットは次のとおりです。詳細については 助けてください:)

4

1 に答える 1

1

私はこれに対して別のアプローチをとったでしょう:

  • ラジオ VM は問題ありませんが、グリッド内の各「行」を含む Children コレクションも必要です。これには、「タイトル」プロパティ (ラベルに付けているもの) とリストが含まれます。テキストボックスに表示する 8 つの文字列値。何かのようなもの:

メイン ビューモデル

  1. -> 無線 VM のリスト
  2. -> 選択したラジオ VM
    1. -> 子の「行」のリスト
      1. -> 行ラベル (文字列プロパティ)
      2. -> 文字列値のリスト

1 つはすべての「行」を描画し、各行、ラベル、および 2 番目の ItemsControl (テキスト ボックスを描画するために ItemsPanelTemplate に水平の StackPanel を使用) を描画するためのものです。

于 2012-10-31T15:41:42.723 に答える