C# WPF:未能清除列表中的项目(&F);添加新频道
我正在WPF中开发一个应用程序,我应该在其中动态生成UI组件并对其执行一些操作。我的做法如下: XAML:C# WPF:未能清除列表中的项目(&F);添加新频道,c#,wpf,list,button,mvvm,C#,Wpf,List,Button,Mvvm,我正在WPF中开发一个应用程序,我应该在其中动态生成UI组件并对其执行一些操作。我的做法如下: XAML: <Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="170" /> &
<Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="170" />
<ColumnDefinition />
<ColumnDefinition Width="130" />
<ColumnDefinition Width="115" />
</Grid.ColumnDefinitions>
<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}" />
<Label Grid.Column="2" Content="{Binding CurrentText}" />
<ToggleButton Grid.Column="3" Content="On" />
</Grid>
<Button Content="Bavaria" Name="BavariaBtn" Click="BavariaBtn_Click" />
public void OnChildAdd()
{
foreach (VoltageBoardChannel mVoltageChannelViewModel in mVoltageViewModel.VoltageChannelList)
{
VoltageChannelView mVoltageChannelView = new VoltageChannelView();
mVoltageChannelView.Margin = new Thickness(2);
mVoltageChannelView.ChannelInfo = mVoltageChannelViewModel;
//Some Code to add the item
}
}
private void BavariaBtn_Click(object sender, RoutedEventArgs e)
{
VoltageViewModel mVoltageViewModel = new VoltageViewModel();
// Here List should get cleared and Bavaria 2 items should be added
mVoltageViewModel.VoltageChannelList.Clear();
mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;
OnChildAdd();
}
public List<VoltageBoardChannel> channelList = null;
public List<VoltageBoardChannel> bavaria2Channels = new List<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
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},
};
private ICommand m_voltageCommand;
public List<VoltageBoardChannel> bavaria1Channels = new List<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 List<VoltageBoardChannel>(0);
channelList = bavaria1Channels;
m_voltageCommand = new DelegateVoltageCommand(x => SetCommandExecute(x));
}
public List<VoltageBoardChannel> VoltageChannelList
{
get
{
return channelList;
}
set
{
channelList = value;
OnPropertyChanged("ChannelList");
}
}
private string mChannelName;
public string ChannelName
{
get
{
return mChannelName;
}
set
{
mChannelName = value;
OnPropertyChanged("ChannelName");
}
}
private bool mIsAvailable;
public bool IsAvailable
{
get
{
return mIsAvailable;
}
set
{
mIsAvailable = value;
OnPropertyChanged("IsAvailable");
}
}
public ICommand VoltageCommand { get; set; }
视图模型:
<Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="170" />
<ColumnDefinition />
<ColumnDefinition Width="130" />
<ColumnDefinition Width="115" />
</Grid.ColumnDefinitions>
<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}" />
<Label Grid.Column="2" Content="{Binding CurrentText}" />
<ToggleButton Grid.Column="3" Content="On" />
</Grid>
<Button Content="Bavaria" Name="BavariaBtn" Click="BavariaBtn_Click" />
public void OnChildAdd()
{
foreach (VoltageBoardChannel mVoltageChannelViewModel in mVoltageViewModel.VoltageChannelList)
{
VoltageChannelView mVoltageChannelView = new VoltageChannelView();
mVoltageChannelView.Margin = new Thickness(2);
mVoltageChannelView.ChannelInfo = mVoltageChannelViewModel;
//Some Code to add the item
}
}
private void BavariaBtn_Click(object sender, RoutedEventArgs e)
{
VoltageViewModel mVoltageViewModel = new VoltageViewModel();
// Here List should get cleared and Bavaria 2 items should be added
mVoltageViewModel.VoltageChannelList.Clear();
mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;
OnChildAdd();
}
public List<VoltageBoardChannel> channelList = null;
public List<VoltageBoardChannel> bavaria2Channels = new List<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
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},
};
private ICommand m_voltageCommand;
public List<VoltageBoardChannel> bavaria1Channels = new List<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 List<VoltageBoardChannel>(0);
channelList = bavaria1Channels;
m_voltageCommand = new DelegateVoltageCommand(x => SetCommandExecute(x));
}
public List<VoltageBoardChannel> VoltageChannelList
{
get
{
return channelList;
}
set
{
channelList = value;
OnPropertyChanged("ChannelList");
}
}
private string mChannelName;
public string ChannelName
{
get
{
return mChannelName;
}
set
{
mChannelName = value;
OnPropertyChanged("ChannelName");
}
}
private bool mIsAvailable;
public bool IsAvailable
{
get
{
return mIsAvailable;
}
set
{
mIsAvailable = value;
OnPropertyChanged("IsAvailable");
}
}
public ICommand VoltageCommand { get; set; }
您可以注意到,在ViewModel类中,Bavaria 1在启动时显示。这里我主要想清除这些项目,然后在BavariaBtn_Click()
上显示Bavaria 2项目,如xaml.cs类所示。我正在尝试这样做,但是列表没有被清除,尽管项目正在被添加
我怎样才能实现它?:) 简单列表不发送有关其元素更改的通知。它不实现
INotifyCollectionChanged
接口
observeablecollection
使用ObservableCollection
而不是您的VoltageChannelList属性的列表,然后
不需要更改属性(“VoltageChannelList”)在setter中,您正在清除一个局部变量。XAML不知道您已经这样做了,事实上除了方法本身之外,没有人知道您已经清除了局部变量:
// Nobody knows the trouble I've seen...
VoltageViewModel mVoltageViewModel = new VoltageViewModel();
// Here List should get cleared and Bavaria 2 items should be added
mVoltageViewModel.VoltageChannelList.Clear();
MVVM清除列表的方法是向视图模型添加一个Clear命令:
public ICommand ClearCommand { get; private set; }
// ...
public VoltageViewModel(...)
{
// ...
this.ClearCommand = new DelegateCommand(
() => this.VoltageChannelList.Clear(),
() => this.VoltageChannelList.Count > 0);
}
然后在XAML中:
<Button Content="Bavaria" x:Name="BavariaBtn" Command="{Binding ClearCommand}" />
首先。。。您确实需要使用ObservableCollection。该列表不会像@Miklos所说的那样发送通知 第二,当你这样做时:
mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;
您正在删除VoltageChannelList列表。你不能这样做。您必须在列表上迭代并手动复制项目
private void BavariaBtn_Click(object sender, RoutedEventArgs e)
{
VoltageViewModel mVoltageViewModel = new VoltageViewModel();
// Here List should get cleared and Bavaria 2 items should be added
mVoltageViewModel.VoltageChannelList.Clear();
foreach (VoltageBoardChannel channel in mVoltageViewModel.bavaria2Channels)
mVoltageViewModel.VoltageChannelList.Add(channel);
}
谢谢你的回复。我用
ObservableCollection
试过了,但还是没有在点击按钮时清除列表。谢谢你的回复。我试过了,但仍然没有清除项目或添加新项目。注意:我的.cs文件中已经有了BavariaBtn\u Click()
,现在如果我使用命令
,你不认为这会导致歧义吗???我试过了,点击按钮,似乎什么也没发生。既然您推荐clearcommand,我们如何既清除列表又添加新频道?