我有ListBox
我绑定到视图模型中的ObservableCollection<Series>
。每次用户单击“删除”按钮时,Delete
类中的DelegateCommand
Series
将在ObservableCollection<Series>
类中执行,该项目将从数据库中删除。
我正在寻找一些更新<ListBox ItemsSource="{Binding SeriesCollection}" Name="lbSeries" Background="#6E7587" ItemContainerStyle="{StaticResource highlightStyle}" SelectionMode="Single" AlternationCount="2" Grid.Row="2" ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Margin="5,0" FontSize="14" Name="txtName" Text="{Binding Name}" Width="190" Height="30" Grid.Column="0" />
<wpfToolkit:IntegerUpDown Value="{Binding Season}" Name="nudSeason" FontSize="14" Height="30" Width="95" Increment="1" Maximum="100000" Minimum="0" Grid.Column="1" />
<wpfToolkit:IntegerUpDown Value="{Binding Episode}" Name="nudEpisode" FontSize="14" Height="30" Width="95" Increment="1" Maximum="100000" Minimum="0" Grid.Column="2" />
<Button Command="{Binding Save}" Grid.Column="3" Width="60" Height="50" Cursor="Hand" ToolTip="Save program" VerticalAlignment="Center" HorizontalAlignment="Center">
<Button.Template>
<ControlTemplate>
<Border HorizontalAlignment="Center" VerticalAlignment="Center" >
<Image Source="Resources\Save.png" Width="30" Height="40" />
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Button Command="{Binding Delete}" Grid.Column="4" Width="60" Height="50" Cursor="Hand" CommandParameter="{Binding ElementName=lbSeries,Path=SelectedItem}" ToolTip="Remove program" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="15,0">
<Button.Template>
<ControlTemplate>
<Border HorizontalAlignment="Center" VerticalAlignment="Center" >
<Image Source="Resources\Delete.png" Width="30" Height="40" />
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Label Content="{Binding Information}" Grid.Column="5" FontSize="14" Margin="10,0" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
的方法,以便在删除XAML视图时立即删除相关项目。
目前这种情况并没有发生,我对WPF相对较新,并且一直试图让这个工作好几天,请告诉我哪里出错:
相关XAML:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using SeriesTracker.Functions;
using System.Linq;
namespace SeriesTracker.Client
{
public class SeriesTrackerViewModel : INotifyPropertyChanged
{
public DelegateCommand NewSeries { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Series> _series = new ObservableCollection<Series>();
public ObservableCollection<Series> SeriesCollection
{
get { return _series; }
set
{
_series = value;
RaisePropertyChanged("SeriesCollection");
}
}
public SeriesTrackerViewModel()
{
NewSeries = new DelegateCommand(AddNewSeries);
DataTable table = DataAccessLayer.GetSeries();
if (table.Rows.Count > 0)
LoadSeries(table);
}
private void LoadSeries(DataTable table)
{
foreach (DataRow row in table.Rows)
{
int id = Int32.Parse(row["Id"].ToString());
string name = row["Name"].ToString();
int season = 0;
int episode = 0;
if (Int32.TryParse(row["Season"].ToString(), out season) &&
Int32.TryParse(row["Episode"].ToString(), out episode))
{
var series = new Series(id, name, season, episode);
SeriesCollection.Add(series);
}
}
}
public void AddNewSeries()
{
SeriesCollection.AddSeries();
}
private void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
查看型号:
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace SeriesTracker.Functions
{
public class Series : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private DelegateCommand _save;
public DelegateCommand Save
{
get { return _save; }
set
{
_save = value;
RaisePropertyChanged("Save");
}
}
private DelegateCommand _delete;
public DelegateCommand Delete
{
get{return _delete;}
set
{
_delete = value;
RaisePropertyChanged("Delete");
}
}
public int Id { get; set; }
string _name;
public String Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}
int _season;
public Int32 Season
{
get { return _season; }
set
{
_season = value;
RaisePropertyChanged("Season");
}
}
int _episode;
public Int32 Episode
{
get { return _episode; }
set
{
_episode = value;
RaisePropertyChanged("Episode");
}
}
string _information;
public String Information
{
get { return _information; }
set
{
_information = value;
RaisePropertyChanged("Information");
}
}
public Series(int id,string name,int season, int episode)
{
Id = id;
Name = name;
Season = season;
Episode = episode;
Save = new DelegateCommand(SaveItem);
Delete = new DelegateCommand(DeleteItem);
}
public void DeleteItem()
{
var selectedItem = this;
if (selectedItem.Id != -1)
{
DataAccessLayer.Delete(selectedItem.Id);
}
}
public void SaveItem()
{
var selectedItem = this;
if (selectedItem.Id == -1)
DataAccessLayer.AddEntry(selectedItem.Name,selectedItem.Season,selectedItem.Episode);
else
DataAccessLayer.Update(selectedItem.Id,
selectedItem.Name,selectedItem.Season,selectedItem.Episode);
}
private void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
系列课程:
{{1}}
答案 0 :(得分:4)
你不应该在Series类中保留DeleteCommand,它应该在视图模型上。
在视图模型中,您可以轻松更新ObservableCollection。
您需要在ViewModel和XAML上使用Type Series的Generic delegate命令,您需要在命令Parameter上传递{Binding}。
查看型号C#: -
DelegateCommand<Series> DeleteCommand { get; set; }
DeleteCommand = new RelayCommand<Series>(OnDelete);
// This method will gets execute on click the of Delete Button1
private void OnDelete(Series series)
{
}
XAML: - 在“删除”按钮上,更改绑定和命令参数值
CommandParameter =“{Binding}”
Command =“{Binding DataContext.DeleteCommand,RelativeSource = {RelativeSource Mode = FindAncestor,AncestorType = {x:Type Window}}}“
希望这会对你有所帮助
答案 1 :(得分:1)
您可以在[{1}}中订阅每个系列的PropertyChangedEventHandler
,然后在事件触发时调用ObservableCollection
更新:我的意思是:
RaisePropertyChanged("SeriesCollection")