我想知道它们之间的区别ObservableCollection,BindingList因为我已经使用了两者来通知Source中的任何添加/删除更改,但实际上我不知道何时更喜欢一个而不是另一个.
为什么我会选择以下其中一个而不是另一个?
ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();
Run Code Online (Sandbox Code Playgroud)
要么
BindingList<Employee> lstEmp = new BindingList<Employee>();
Run Code Online (Sandbox Code Playgroud) 如果我有以下代码:
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
Run Code Online (Sandbox Code Playgroud)
pClass会被垃圾收集吗?或者它会在它们发生的时候仍然停止发射?我是否需要执行以下操作才能进行垃圾回收?
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
Run Code Online (Sandbox Code Playgroud) 有谁知道为什么这段代码不起作用:
public class CollectionViewModel : ViewModelBase {
public ObservableCollection<EntityViewModel> ContentList
{
get { return _contentList; }
set
{
_contentList = value;
RaisePropertyChanged("ContentList");
//I want to be notified here when something changes..?
//debugger doesn't stop here when IsRowChecked is toggled
}
}
}
public class EntityViewModel : ViewModelBase
{
private bool _isRowChecked;
public bool IsRowChecked
{
get { return _isRowChecked; }
set { _isRowChecked = value; RaisePropertyChanged("IsRowChecked"); }
}
}
Run Code Online (Sandbox Code Playgroud)
ViewModelBase包含所有东西RaisePropertyChanged等等,它除了这个问题以外的所有其他工作..
我的具体问题是:如何将模型更改从模型传递到ViewModel?
在Josh的文章中,我没有看到他这样做.ViewModel始终向Model询问属性.在Rachel的例子中,她确实拥有模型实现INotifyPropertyChanged,并从模型中引发事件,但它们是供视图本身使用的(有关她为什么这样做的详细信息,请参阅她的文章/代码).
我在任何地方都看不到模型警告ViewModel模型属性更改的示例.这让我担心,也许是因为某些原因没有做到的. 是否有一种模式用于警告ViewModel模型中的更改? 这似乎是必要的,因为(1)可以想象每个模型有超过1个ViewModel,(2)即使只有一个ViewModel,模型上的某些操作可能会导致其他属性被更改.
我怀疑可能会有"你为什么要这样做?"的答案/评论.评论,所以这里是我的程序的描述.我是MVVM的新手,所以也许我的整个设计都有问题.我将简要介绍一下.
我编写的东西比"客户"或"产品"类更有趣(至少对我而言!).我在编程BlackJack.
我有一个View,后面没有任何代码,只依赖于绑定到ViewModel中的属性和命令(参见Josh Smith的文章).
是好还是坏,我把该模型应该不仅包含类,如态度PlayingCard,Deck但也BlackJackGame认为保持整场比赛的状态,并且知道当玩家已经破产,经销商必须抓牌,阶级和玩家和经销商当前得分是多少(少于21,21,胸围等).
从BlackJackGame我公开像"DrawCard"这样的方法,我发现在绘制卡片时CardScore,IsBust应该更新属性,例如和,并将这些新值传递给ViewModel.也许这是错误的思考?
人们可以采取ViewModel称之为DrawCard()方法的态度,因此他应该知道要求更新的分数并找出他是否破产.意见?
在我的ViewModel中,我有逻辑来获取扑克牌的实际图像(基于套装,等级)并使其可用于视图.该模型不应该与此有关(也许其他ViewModel只使用数字而不是扑克牌图像).当然,也许有些人会告诉我模型甚至不应该有BlackJack游戏的概念,而应该在ViewModel中处理?
我有一个绑定到ObservableCollection的WPF ListBox,当集合发生变化时,所有项目都会更新它们的位置.
新位置存储在集合中,但UI不会更新.所以我添加了以下内容:
void scenarioItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
ToolboxListItem.UpdatePositions();
lstScenario.ItemsSource = null;
lstScenario.ItemsSource = ToolboxListItem.ScenarioItems;
this.lstScenario.SelectedIndex = e.NewStartingIndex;
}
Run Code Online (Sandbox Code Playgroud)
通过将ItemsSource设置为null然后再次绑定它,UI将更新,
但这可能是非常糟糕的编码:p
建议?
我有一个绑定的数据网格ObservableCollection<Product>.更新网格后,这会自动更新集合中的Product对象.
我现在要做的是在集合中的任何对象被更新时触发某种甚至触发 - 或者 - 某种类型的绑定到集合,如果任何Product已经更新,它将返回true/false depedant.
总体目标是在我的主窗口上有一个保存按钮,如果没有对我的集合进行任何更改则禁用该按钮,如果已进行了更改,则启用该按钮.
我已阅读INotifyPropertyChange但我不知道如何使用它来监控整个集合的变化.
另外,如果我在Product类上实现此接口,我不会看到我的UI如何监视集合中的每个产品 - 或者它可以吗?
问题:
ItemsControl(或从中派生的控件ItemsControl).ItemsControl.ItemsSource属性绑定到ObservableCollectionViewModel中的a.ObservableCollection.ObservableCollection.背景:
这似乎是许多WPF开发人员遇到的常见问题.有人问过几次:
ObservableCollection没有注意到它中的Item何时发生变化(即使使用INotifyPropertyChanged)
ObservableCollection和Item PropertyChanged
我的实施:
当Item更改时,我尝试在Notify ObservableCollection中实现接受的解决方案.基本思想是PropertyChanged在MainWindowViewModel中为每个项目连接一个处理程序ObservableCollection.更改项目的属性时,将调用事件处理程序,并以某种方式更新视图.
我无法让实现工作.这是我的实施.
的ViewModels:
class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName = "")
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Run Code Online (Sandbox Code Playgroud)
项目视图模型:
class EmployeeViewModel : ViewModelBase
{
private int _age;
private string _name;
public int Age
{ …Run Code Online (Sandbox Code Playgroud) 我有一个listview,我xaml填充这样的项目:
List<DataLayer.Models.Dictionary> dicts = DataLayer.Manager.getDictionaries();
if (dicts != null)
{
foreach (DataLayer.Models.Dictionary dict in dicts)
{
this.itemListView.Items.Add(dict);
}
}
Run Code Online (Sandbox Code Playgroud)
我的DataLayer.Models.Dictionary对象有一个isSelected属性以及a Name和a SubName.
名称和子名称在模板中工作正常,但如何在用户单击项目时获取项目并进行更新?
谢谢!
编辑:
我的xaml现在看起来像这样,但项目仍未选中
<ListView
x:Name="itemListView"
TabIndex="1"
Grid.Row="1"
Margin="0,60,0,0"
Padding="0,0,0,0"
IsSwipeEnabled="False"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectionChanged="itemListView_SelectionChanged_1"
SelectionMode="Multiple"
FontFamily="Global User Interface">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding Source=Selected,Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="0,0,0,0">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding SubName}" Style="{StaticResource CaptionTextStyle}" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate> …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现我的第一个MVVM应用程序.我可以将数据绑定到数据网格中,但是我在项目中所做的更改不会触发模型的RaisePropertyChanged方法.
这是我的ViewModel
public class UsersViewModel : BaseViewModel
{
private static TOPEntities _context;
private ObservableCollection<UserModel> _usersCollection;
public UsersViewModel()
{
_usersCollection = new ObservableCollection<UserModel>(GetAllUsers());
}
public ObservableCollection<UserModel> UsersCollection
{
get { return _usersCollection; }
set
{
if (_usersCollection != value)
{
_usersCollection = value;
RaisePropertyChanged(() => UsersCollection);
}
}
}
public static List<UserModel> GetAllUsers()
{
using (_context = new TOPEntities())
{
return _context.Users.Select
(user => new UserModel
{
Id_User = user.Id_User,
Name = user.Name,
Username = user.Username,
Language = user.Language,
Password = …Run Code Online (Sandbox Code Playgroud) 我有一个ItemsControl对象绑定到ObservableCollection.
这是我的ItemsControl:
<ItemsControl x:Name="AvailableProjects" ItemsSource="{Binding ProjectsList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<CheckBox x:Name="IsProjectSelected" IsChecked="{Binding IsProjectSelected}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
这是我的ObservableCollection:
public ObservableCollection<ProjectInfo> ProjectsList { get; set; }
Run Code Online (Sandbox Code Playgroud)
我希望当用户按下checkBox时,observableCollection的"CollectionChanged"事件被触发但它不起作用.我注意到复选框项正在处理事件,似乎ObservableCollection没有注意到.有人可以帮我这个吗?提前致谢!
我在一个用DataTemplate设计的ObservableCollection中暴露了一个Model类,其中处理了Model的proeprty绑定.
当我手动在Model类中实现INotifyPropertyChanged接口时,ObservableCollection中的绑定proeprty不会自动更改,而只是在重新呈现集合之后.
当我从ViewModelBase(MVVM Light工具包类)继承并使用RasiePropertyChanged方法时,绑定属性会自动更改而不刷新整个集合.
除了实现INotifyPropertyChanged接口之外,ViewModelBase做了什么?
c# ×8
wpf ×8
.net ×3
mvvm ×3
itemscontrol ×2
binding ×1
data-binding ×1
datagrid ×1
events ×1
listbox ×1
mvvm-light ×1
windows-8 ×1
winrt-xaml ×1
wpf-4.0 ×1
wpfdatagrid ×1
xaml ×1