相关疑难解决方法(0)

ObservableCollection和BindingList之间的区别

我想知道它们之间的区别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)

.net c# wpf observablecollection wpf-4.0

234
推荐指数
3
解决办法
6万
查看次数

事件处理程序是否阻止垃圾收集发生?

如果我有以下代码:

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)

.net c# garbage-collection event-handling

178
推荐指数
3
解决办法
3万
查看次数

ObservableCollection没有注意到它中的Item何时发生变化(即使使用INotifyPropertyChanged)

有谁知道为什么这段代码不起作用:

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等等,它除了这个问题以外的所有其他工作..

c# observablecollection inotifypropertychanged

158
推荐指数
10
解决办法
16万
查看次数

WPF中的MVVM - 如何提醒ViewModel模型中的更改...还是应该?

我正在阅读一些MVVM文章,主要是这个这个.

我的具体问题是:如何将模型更改从模型传递到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中处理?

.net c# wpf mvvm

105
推荐指数
4
解决办法
9万
查看次数

强制数据绑定WPF ListBox更新的更好方法是什么?

我有一个绑定到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

建议?

data-binding wpf listbox observablecollection

30
推荐指数
3
解决办法
6万
查看次数

如何检测我的ObservableCollection中的项是否已更改

我有一个绑定的数据网格ObservableCollection<Product>.更新网格后,这会自动更新集合中的Product对象.

我现在要做的是在集合中的任何对象被更新时触发某种甚至触发 - 或者 - 某种类型的绑定到集合,如果任何Product已经更新,它将返回true/false depedant.

总体目标是在我的主窗口上有一个保存按钮,如果没有对我的集合进行任何更改则禁用该按钮,如果已进行了更改,则启用该按钮.

我已阅读INotifyPropertyChange但我不知道如何使用它来监控整个集合的变化.

另外,如果我在Product类上实现此接口,我不会看到我的UI如何监视集合中的每个产品 - 或者它可以吗?

c# wpf inotifypropertychanged wpfdatagrid

20
推荐指数
2
解决办法
2万
查看次数

更新ObservableCollection中的项目时更新ItemsControl

问题:

  • 您在视图中声明ItemsControl(或从中派生的控件ItemsControl).
  • 您将ItemsControl.ItemsSource属性绑定到ObservableCollectionViewModel中的a.
  • 当项目被添加到/从中删除时,您的视图会按预期更新ObservableCollection.
  • 但是,当您更改项目中的项目的属性时,视图不会更新ObservableCollection.

背景:

这似乎是许多WPF开发人员遇到的常见问题.有人问过几次:

项目更改时通知ObservableCollection

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)

c# wpf itemscontrol observablecollection mvvm

10
推荐指数
1
解决办法
1万
查看次数

ListView被选中

我有一个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)

c# xaml windows-8 winrt-xaml

9
推荐指数
1
解决办法
5216
查看次数

WPF:绑定数据网格不更新项属性

我正在尝试实现我的第一个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)

wpf binding datagrid

7
推荐指数
1
解决办法
2万
查看次数

如何在更新项目时发出observableCollection通知,而不仅仅是在添加或删除项目时?

我有一个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没有注意到.有人可以帮我这个吗?提前致谢!

wpf events itemscontrol observablecollection

2
推荐指数
1
解决办法
2549
查看次数

在集合中公开的模型中实现INotifyPropertyChanged

我在一个用DataTemplate设计的ObservableCollection中暴露了一个Model类,其中处理了Model的proeprty绑定.

当我手动在Model类中实现INotifyPropertyChanged接口时,ObservableCollection中的绑定proeprty不会自动更改,而只是在重新呈现集合之后.

当我从ViewModelBase(MVVM Light工具包类)继承并使用RasiePropertyChanged方法时,绑定属性会自动更改而不刷新整个集合.

除了实现INotifyPropertyChanged接口之外,ViewModelBase做了什么?

c# wpf mvvm mvvm-light

1
推荐指数
1
解决办法
1602
查看次数