看标题可能看起来很简单,但它很棘手。我正在开发一个 wpf 应用程序,我需要在其中动态生成按钮、标签和文本框。在我的 VoltageView XAml 文件中,我创建了一个堆栈面板。在我的 VoltageChannelView xaml 文件中,我创建了所有 UI 组件。
我在一定程度上实现了如下:
电压视图:
<Grid Grid.Row="1" Style="{DynamicResource styleBackground}" Name="VoltageChannels" >
<StackPanel Height="Auto" Name="stackPanel" Width="Auto" MinHeight="300"></StackPanel>
</Grid>
电压通道视图:
<Label Grid.Column="0" Content="{Binding ChannelName}" />
<TextBox Grid.Column="1" Text="{Binding VoltageText}" />
<Button Grid.Column="1" Content="Set" CommandParameter="{Binding VoltageText}" Command="{Binding VoltageCommand}" />
我将上述动态生成的 Ui 组件添加到我的 VoltageView.xaml.cs 中的堆栈面板中,如下所示:
VoltageViewModel mVoltageViewModel = new VoltageViewModel();
// Called in constructor
public void OnChildAdd()
{
foreach (VoltageBoardChannel mVoltageChannelViewModel in mVoltageViewModel.VoltageChannelList)
{
VoltageChannelView mVoltageChannelView = new VoltageChannelView();
mVoltageChannelView.Margin = new Thickness(2);
mVoltageChannelView.ChannelInfo = mVoltageChannelViewModel;
stackPanel.Children.Add(mVoltageChannelView);
}
}
电压视图模型类:
public ObservableCollection<VoltageBoardChannel> channelList = null;
public ObservableCollection<VoltageBoardChannel> redhookChannels = new ObservableCollection<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD_IO_AUD", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD_CODEC_AUD", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD_DAL_AUD", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD_DPD_AUD", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD_PLL_AUD", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD_AMP1_AUD", IsAvailable = true}
};
public ObservableCollection<VoltageBoardChannel> bavaria1Channels = new ObservableCollection<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD__IO", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD__CODEC", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD__LDO", IsAvailable = true},
new VoltageBoardChannel { ChannelName = "VDD__AMP", IsAvailable = true},
};
public VoltageViewModel()
{
channelList = new ObservableCollection<VoltageBoardChannel>();
channelList = bavaria1Channels;
}
public ObservableCollection<VoltageBoardChannel> VoltageChannelList
{
get
{
return channelList;
}
set
{
channelList = value;
OnPropertyChanged("ChannelList");
}
}
RelayCommand _voltageCommand;
public ICommand VoltageCommand
{
get
{
if (_voltageCommand == null)
{
_voltageCommand = new RelayCommand(param => this.DoSomethingExecute, param => this.DoSomethingCanExecute);
}
return _voltageCommand;
}
}
public bool DoSomethingCanExecute(object param)
{
return true;
}
public void DoSomethingExecute(object param)
{
}
正如您在启动时看到的那样,显示了BAVARIA1通道。
VoltageBoardChannel(型号)类:
private string mChannelName;
public string ChannelName
{
get
{
return mChannelName;
}
set
{
mChannelName = value;
OnPropertyChanged("ChannelName");
}
}
private bool mIsAvailable;
public bool IsAvailable
{
get; set;
}
string voltageText = string.Empty;
public string VoltageText
{
get
{
return voltageText;
}
set
{
voltageText = value;
OnPropertyChanged("VoltageText");
}
}
因此,当我运行该应用程序时,它会在列表中动态显示 4 次 bavaria1 频道。现在在每个动态生成的控件上都有一个文本框和按钮。
你可以注意到VoltageChannelView.xaml
我已经做了一个绑定 bw 按钮和文本框。我想在文本框中输入值并单击 SET 按钮,它应该检索输入的值,以便可以完成进一步的操作。基本上应该有一个 SET 按钮的事件,它应该将 Textbox 中写入的文本作为参数传递。
我怎样才能实现它?:)