小编Sla*_*ker的帖子

我应该如何从NSArrayController控制的NSTableView中删除所有项目?

我正在使用一个NSArrayController,NSMutableArrayNSTableView显示我自己的自定义对象的列表(虽然这个问题可能适用于你只是显示一个香草NSString对象的列表).

在不同的时间点,我需要清除我的数组并刷新数据源中的数据.但是,只是调用removeAllObjects我的NSMutableArray对象不会触发KVO更新,因此屏幕上的列表保持不变.

NSArrayController没有 removeAllObjects可用的方法,这似乎很奇怪.(它确实有addObject,我用它来添加对象,确保触发KVO并更新UI.)

我设法导致这种情况正确发生的最干净的方法是:

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
Run Code Online (Sandbox Code Playgroud)

...所以我有点必须自己手动进行KVO通知(这是在我的测试app类中,包含myArray属性,NSMutableArray如上所述.)

这似乎不对 - 有更好的方法吗?从我的谷歌搜索,似乎有几个人因缺乏的困惑removeAllObjectsNSArrayController,但还没有看到任何更好的解决方案.

我见过这个解决方案:

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];
Run Code Online (Sandbox Code Playgroud)

但这看起来对我来说更加不愉快.至少我的解决方案至少是自我记录.

Apple没有注意到有时人们可能想要清空通过NSArrayController对象管理的列表控件吗?这看起来很明显,所以我想我一定错过了什么......

除此之外:当然,如果我向数组添加新项目(via NSArrayController),那么这将触发KVO更新NSArrayController/NSTableView,但是:

  1. 有时我不会在列表中放任何项目,因为没有.所以你只看到旧物品.
  2. 无论如何这有点令人讨厌.

macos cocoa nsarraycontroller

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

如何以编程方式在Silverlight中定位画布?

我正在使用Silverlight 3/C#,我正在尝试以编程方式创建一些XAML对象以响应用户单击按钮.

但是,我似乎无法定位Canvas我创建的对象 - 当我使用值调用SetValue()new CanvasCanvas.LeftProperty,浏览器窗口将清除为空屏幕.

我有一个简单的函数来展示问题(我开始使用更复杂的东西):

    private Canvas MakeNewCanvas()
    {
        Canvas newCanvas = new Canvas();
        newCanvas.Width = newCanvas.Height = 50;
        newCanvas.SetValue(Canvas.LeftProperty, 10);
        return newCanvas;
    }
Run Code Online (Sandbox Code Playgroud)

和一个简单的按钮单击处理程序,它调用:

    private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        myPage.Children.Add(MakeNewCanvas());
    }
Run Code Online (Sandbox Code Playgroud)

注意:myPage是我的应用程序的MainPage XAML文件中定义的Canvas对象.

我已经在VS调试器中跟踪了这一点,并且在Firefox中执行了SL应用程序,并且无论何时执行该SetValue()行,浏览器都会变白并开始尝试下载数据(根据状态栏).SetValue()在我将CanvasXAML树放入以下内容之后,我尝试了调用:

    myPage.Children.Add(newCanvas);
    newCanvas.SetValue(Canvas.LeftProperty, 10);
Run Code Online (Sandbox Code Playgroud)

但它没有任何区别 - 一旦SetValue()呼叫被击中,浏览器就会变白.

Canvas级似乎对自身设置左/顶,除了没有直接的方法SetValue()与依赖属性枚举值的功能.还有Canvas.SetLeft(),Canvas.SetTop()但我想他们只是垫片SetValue().无论如何,使用它们并没有帮助.

如果我不打电话SetValue(),那么我的画布会在SL应用程序中出现(和我添加到它上面的子对象),如你所料,在最左上方.

如果我Canvas在Expression Blend中创建并定位一个对象,那么XAML就会生成包含Canvas.Left …

c# silverlight position canvas properties

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