0

アプリで動的に生成されるラジオボタンのセットに取り組んでいます。クラスメンバーへのアクセスに関しては、問題に直面しているようです。これが私が今までやったことです:

XAML:

<GroupBox Header="Daughter Cards" Height="Auto" HorizontalAlignment="Stretch" Margin="20,5,20,20" Name="groupBox2" VerticalAlignment="Stretch" Width="Auto">
            <Grid>                   
                <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" IsChecked="{Binding IsChecked}" GroupName="SlotGroup" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Grid>                

                <Grid Grid.Column="1">                                                  
                        <ComboBox Grid.Row="0" ItemsSource="{Binding DaughterBoardBoxList}" SelectedItem="{Binding SelectedDaughterBoardBoxList, Mode=TwoWay}" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0" Name="comboBox5" VerticalAlignment="Center" Width="158" />
                        <ComboBox Grid.Row="1" ItemsSource="{Binding DaughterVersionBoxList}" SelectedItem="{Binding SelectedDaughterVersionBoxList, Mode=TwoWay}" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0" Name="comboBox6" VerticalAlignment="Center" Width="158" />
                        <ComboBox Grid.Row="2" ItemsSource="{Binding DaughterSerialBoxList}" SelectedItem="{Binding SelectedDaughterSerialBoxList, Mode=TwoWay}" SelectedIndex="0" Height="23" HorizontalAlignment="Center" Margin="0" Name="comboBox7" VerticalAlignment="Center" Width="158" />

                        <Button Grid.Row="1" Command="{Binding GetStringCommand}" Content="Get String" Height="23" HorizontalAlignment="Center" Margin="0" Name="RefreshDaughterCards" VerticalAlignment="Center" Width="90" />
                        <Button Grid.Row="2" Command="{Binding SetStringCommand}" Content="Set String" Height="23" HorizontalAlignment="Center" Margin="0" Name="WriteEEPROMDCBtn" VerticalAlignment="Center" Width="90" />
                        <Label Content="{Binding DaughterStatus}" Height="25" HorizontalAlignment="Center" Margin="0" Name="DaughterCardLabel" VerticalAlignment="Center" Width="170" />
                    </Grid>                                       
                </Grid> 
        </GroupBox>

EEPROMViewModel クラス:

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

public EEPROMViewModel ()
{
        SlotChildren = new ObservableCollection<EEPROMSlotViewModel>();
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "0 : None", ID = 0 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "1 : None", ID = 1 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "2 : None", ID = 2 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "3 : None", ID = 3 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "4 : None", ID = 4 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "5 : None", ID = 5 });
        SlotChildren.Add(new EEPROMSlotViewModel() { ParentVM = this, SlotButtons = "6 : None", ID = 6 });
 }

それぞれに関連する ID を持つ 7 つのラジオボタンを生成します。

EEPROMSlotViewModel クラス:

private string _SlotButtons;
    public string SlotButtons
    {
        get; set;
    }

    private EEPROMViewModel _parentVm;
    public EEPROMViewModel ParentVM
    {
        get; set;
    }

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

    private bool _isChecked;
    public bool IsChecked
    {
        get; set;
    }

したがって、ラジオボタンを選択してボタンをクリックするとSETSTRING、次のコードが実行されます。

EEPROMSlotViewModel mSlotVM = new EEPROMSlotViewModel();

        string label;
        if (mSlotVM.ID == 0) //Accessing the 1st radiobutton clicked
        {
            label = string.Empty;
            mSlotVM.getShortName(0, label);
            if (label == string.Empty)
            {
                label = "None";
            }

            mSlotVM.SlotButtons = Convert.ToString(0 + ":" + label); // Setting CONTENT of radiobutton selected 
        }

最初のラジオ ボタンをクリックしたとします。ID は 0 でgetShortName()ある必要があります。次のことを行うメソッドを呼び出します。

ParentVM.SelectedDaughterBoardBoxList = ParentVM.DaughterBoardBoxList[0];
ParentVM.SelectedDaughterVersionBoxList = ParentVM.DaughterVersionBoxList[0];
ParentVM.SelectedDaughterSerialBoxList = ParentVM.DaughterSerialBoxList[0];
shortlabel = "Hello";

ここでいくつかの問題に直面しています:

  • 他のクラスメンバー/関数にアクセスする正しい方法はmSlotVM??
  • 制御が に入るgetShortname()と、次のように例外をスローします: Object reference not set to an instance of an object.at ParentVM.DaughterBoardBoxList[0];.
  • getShortName() の最初の 3 つのステートメントをコメントしても、getShortName が呼び出され、コントロールが戻ってくると、値 labelは "" になるはずです。

mSlotVmこれが例外の背後にある理由だと思います。助けてください :)

4

1 に答える 1

1
  1. いいえ、EEPROMSlotViewModel-Class の新しいインスタンスを作成するだけで、RadioButtons ViewModel のいずれにもアクセスしていません。
  2. -クラスを見せていただけるとEEPROMViewModel助かります。問題は、あなたのParentVM.-Lists がnullであることだと思います。
  3. 目的を達成するには、メソッドは次のようにする必要がありますgetShortname()

    public void getShortname(int i, ref string shortlabel)
    {
        ParentVM.SelectedDaughterBoardBoxList = ParentVM.DaughterBoardBoxList[0];
        ParentVM.SelectedDaughterVersionBoxList = ParentVM.DaughterVersionBoxList[0];
        ParentVM.SelectedDaughterSerialBoxList = ParentVM.DaughterSerialBoxList[0];
        shortlabel = "Hello";
    }
    

編集:EEPROMSlotViewModel mSlotVM = new EEPROMSlotViewModel();の新しいインスタンスを作成しますがEEPROMSlotViewModel、チェック済みの RadioButtons ViewModel を取得していません。したがって、mSlotVM.getShortName(0, label);mSlotVM には ParentVM がないと呼び出した時点で、それが例外を発生させます。できることは、SlotChildren-List を調べて、IsChecked プロパティが true である EEPROMSlotViewModel を取得することです。

例:

EEPROMSlotViewModel checkedVM;    
string label = string.Empty;
foreach (EEPROMSlotViewModel vm in SlotChildren)
{
    if (vm.IsChecked)
    {
        checkedVM = vm;
    }
    else
    {
        vm.SlotButtons = vm.ID + " : NONE"
    }

} 
checkedVM.getShortName(0, ref label);
if (label == string.Empty)
{
    label = "None";
}
checkedVM.SlotButtons = Convert.ToString(0 + ":" + label); // Setting CONTENT of radiobutton selected 
于 2012-10-30T10:58:20.190 に答える