0

私はC++開発者であり、現在WPFアプリに取り組んでいます。このアプリでは、4つのラジオボタンを動的に生成する必要があり、各ボタンのタイトル名は異なります。私はMVVMパターンに従っています。

<Grid Grid.Row="0">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="35" />                
        </Grid.RowDefinitions>

        <RadioButton Grid.Row="0" Content="{Binding RadioBase}" IsChecked="{Binding BaseCheck}" Height="15" Width="80" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Center" />
        <Button Grid.Row="1" Content="Refresh Regs" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0" Width="100" Height="25" />
</Grid>

XAM1に気付いた場合は、ラジオボタンが1つだけありますGrid.Row="0"Content理想的には、それを4回生成し、それにバインディングを設定して、IsChecked4つの異なるを与えるようにしますContent

ViewModel:

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

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

        set
        {
            _RadioBase= value;
            OnPropertyChanged("RadioBase");
        }
    }

私はこれをC++アプリケーションで次のように実行しました。

for(i = 0; i < 4; i++)
{
    m_registerBase[i] = new ToggleButton(("Base 0x")+String::toHexString(i * 0x40));        
    addAndMakeVisible(m_registerBase[i]);
    m_registerBase[i]->addButtonListener(this);
}

ここに気付くと、4回作成され、ボタンクリックイベントが1つあります。次のようにタイトルを作成します。

  • ボタン1=ベース0x0(i = 0およびtoHexStringが0x0を0に変換するため)
  • ボタン2=ベース0x40(i = 1およびtoHexStringが0x40を40に変換するため)
  • ボタン3=ベース0x80(i = 2およびtoHexStringが0x80を80に変換するため)
  • ボタン4=ベース0xc0(i = 3であり、toHexStringが0xc0をc0に変換するため)

WPFアプリケーションでこのようにするにはどうすればよいですか?:)皆さんが私がこれを解決するのを手伝ってくれたら幸いです。:)

ありがとう

4

4 に答える 4

1

MVVM パターンに固執したい場合は、Gridコントロールを に置き換えることを検討する必要がありItemsControlます。次に、2つのビューモデルが必要です。質問で説明した子ビューモデルと、子ビューモデルのコレクションを含む親ビューモデルです。

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

    public ParentViewModel()
    {
        Children = new ObservableCollection<FPGAViewModel>();
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x0" });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x40" });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0x80" });
        Children.Add(new FPGAViewModel() { RadioBase = "Base 0xc0" });
    }

子アイテムを動的に追加および削除できるようにしたい場合は、に基づくコレクションを使用する必要がありますObservableCollection<T>が、正確に 4 つの子アイテムに固執する必要があるようです。

は、 内の各アイテムItemsControlのテンプレート ( ) に基づいてアイテムを生成できます。これらのアイテムは、デフォルトで に配置されます。それぞれの上にラジオボタンを積み重ねることは、おそらくあなたが望むものです。ItemTemplateItemsSourceItemsPanelStackPanel

<ItemsControl ItemsSource="{Binding Children}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical"
                    IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <RadioButton Content="{Binding RadioBase}" Margin="0,10,0,0" IsChecked="{Binding BaseCheck}" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
</ItemsControl>

のは のインスタンスに設定する必要があることDataContextに注意してください。MVVM では、これは、 を含むビューを親ビューモデルにバインドすることによって行われます。子アイテムを生成すると、それぞれが各インスタンスにバインドされ、そのバインドがそのビューモデルにバインドされます。ItemsControlParentViewModelItemsControlItemsControlRadioButtonDataContextChildViewModelRadioButton

于 2012-10-25T08:20:01.330 に答える
1

あなたのコメントに基づいて、完全な例を作成しました:

モデル:

    namespace WpfApplication1
    {
        public class RB
        {
            public bool BaseCheck { get; set; }
            public string RadioBase { get; set; }
        }
    }

RBVM:

        namespace WpfApplication1
        {
            public class RBVM : INotifyPropertyChanged
            {

                public RBVM()
                {
                    _rb = new RB();
                }

               private RB _rb;
                public RB RB
               {
                   get
                   {
                       return _rb;
                   }
                   set
                   {
                       _rb = value;
                   }
               }

                public bool BaseCheck
                {
                    get
                    {
                        return RB.BaseCheck;
                    }
                    set
                    {
                        RB.BaseCheck = value;
                        RaisePropertyChanged("BaseCheck");
                    }
                }

                public string RadioBase
                {
                    get
                    {
                        return RB.RadioBase;
                    }
                    set
                    {
                        RB.RadioBase = value;
                        RaisePropertyChanged("RadioBase");
                    }
                }








                public event PropertyChangedEventHandler PropertyChanged;

                                                    #region Methods

            private void RaisePropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            #endregion
            }
        }

ビューモデル:

     namespace WpfApplication1
    {
        public class RBViewModel : INotifyPropertyChanged
        {

            public void AddRb(string content, bool isChk) 
            {
                _rbs.Add(new RBVM() { RadioBase = content, BaseCheck = isChk });
            }


            public void ClearAllValues() {
                foreach (RBVM item in _rbs)
                {
                    item.BaseCheck = false;
                }

            }

            public RBVM GetChecked() {
                foreach (RBVM item in _rbs)
                {
                    if (item.BaseCheck) {
                        return item;
                    }
                }

                return null;

            }


            private ObservableCollection<RBVM> _rbs = new ObservableCollection<RBVM>();


            public ObservableCollection<RBVM> Rbs
           {
               get
               {
                   return _rbs;
               }
               set
               {
                   _rbs = value;
               }
           }



            public event PropertyChangedEventHandler PropertyChanged;

            #region Methods

            private void RaisePropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            #endregion
        }
    }

XAML

    <Window x:Class="WpfApplication1.MainWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow1" Height="300" Width="300">

        <Window.DataContext>
            <local:RBViewModel />
        </Window.DataContext>
        <Window.Resources>

            <DataTemplate x:Key="RadioDataTemplate">
                <StackPanel>
                    <RadioButton GroupName="someGroup" Content="{Binding RadioBase}" IsChecked="{Binding BaseCheck}" Height="15" Width="80" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </StackPanel>
            </DataTemplate>

        </Window.Resources>

        <Grid x:Name="main">

            <ItemsControl ItemsSource="{Binding Rbs}" ItemTemplate="{StaticResource RadioDataTemplate}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel x:Name="radios" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>

            <Button Width="50" Height="10" x:Name="test" Click="test_Click" ></Button>
        </Grid>

    </Window>

XAML コード ビハインド:

          namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow1.xaml
        /// </summary>
        public partial class MainWindow1 : Window
        {
            RBViewModel _viewModel;

            public MainWindow1()
            {
                InitializeComponent();

                _viewModel = (RBViewModel)base.DataContext;


                for (int i = 0; i < 4; i++)
                {
                    _viewModel.AddRb("a" + i, true);

                }
            }

            private void test_Click(object sender, RoutedEventArgs e)
            {
                Console.WriteLine(_viewModel.GetChecked().RadioBase);
                _viewModel.ClearAllValues();
            }



        }


    }
于 2012-10-25T07:29:40.657 に答える
0

Yopuは、RadioBox以下を使用してグループ化されたesの動的生成を実現できXAMLます。Binding

XAML:

<ListBox SelectionMode="Single"
         SelectedValue="{Binding CurrentRadioDescription}"
         SelectedValuePath="Description"
         ItemsSource="{Binding RadioBoxModelList}" 
    Focusable="True"
    KeyboardNavigation.IsTabStop="True"          
    VerticalAlignment="Center"
    BorderBrush="Transparent"
    BorderThickness="0"
    Background="Transparent" >
<ListBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
    Color="Transparent"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlDarkBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveBorderBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlDarkDarkBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlLightBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlLightLightBrushKey}" 
    Color="Transparent"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" 
    Color="Transparent"/>
</ListBox.Resources>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
    <StackPanel 
        Orientation="Horizontal"
        Background="Transparent"/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
    <DataTemplate>
    <RadioButton 
          MinWidth="80"
                  Background="Transparent"
          IsChecked="{Binding Path=IsSelected, 
                  RelativeSource={RelativeSource 
                    AncestorType={x:Type ListBoxItem}},
                  Mode=TwoWay}"
         Content="{Binding Description, Mode=OneWay}" 
         Margin="-1"/>
    </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

C#

public class RadioBoxModel : INotifyPropertyChanged { 
      //Raise property changed notifications in Setters below.
      public bool IsChecked { get; set; } 
      public string Description { get; set; }
}
于 2012-10-25T08:16:03.893 に答える
0
for(i = 0; i < 4; i++)
{
    m_registerBase[i] = new RadioButton();        
    m_registerBase[i].IsChecked=true;
    //Sets the Binding programmatcially
    m_registerBase[i].SetBinding(RadioButton.Content, "MyContent");
}

RadioButton クラス

SetBinding

于 2012-10-25T07:24:13.043 に答える