这种情况经常出现:
在视图中,您有一个绑定到ViewModel属性的控件(由INotifyPropertyChanged支持).例如:
<TextBlock Text="{Binding Path=Subtotal}"/>
Run Code Online (Sandbox Code Playgroud)
当属性发生变化时,您需要通过一些创意动画吸引用户注意这一事实.我如何利用视图已连接到通知并避免创建大量额外代码(或至少创建一次并重复使用)这一事实.数据触发器可能是最好的选择,但我不知道如何使它们在任何值变化时触发,而不是某些特定值.
我想到以下选项:
你喜欢/使用哪一个?我错过了任何选择吗?
PS如果解决方案提供了首先启动动画并在结束时反映值变化的可能性,那将是很好的(但不是关键).
在我的应用程序中,我动态加载一些程序集,具体取决于用户的选择.当然,这些都没有在项目中引用.使用ClickOnce发布时,这些程序集不包含在程序包中.
问题是 - 是否有可能欺骗ClickOnce发布者使用项目中未引用的其他文件?
给定一个组ID /值元组的序列,很容易计算组总数(与使用C#和LINQ的方式非常相似):
let items = ["g1",5; "g2",10; "g1",20]
let groupsums =
items
|> Seq.groupBy (fun x -> fst x)
|> Seq.map (fun (g, s) -> Seq.fold (fun acc x -> acc + snd x) 0 s)
Run Code Online (Sandbox Code Playgroud)
但是对于F#来说是新手,我看不到与列表相同的方法.我是否必须使用可变变量,或者是否有一种功能性的方法来对列表进行相同的操作?
我很难理解为什么Swift中有两种不同的结构几乎相同.
编辑:我想我仍然不明白序列中的"懒惰"是什么意思... Fe采用这个使用SequenceOf的代码,该代码据说不是懒惰的:
func myMap<S: SequenceType, V>(source: S,
selector: S.Generator.Element -> V) -> SequenceOf<V> {
let seq = SequenceOf {
_ -> GeneratorOf<V> in
var gen = source.generate()
return GeneratorOf {
let v = gen.next()
println(v)
return v == nil ? nil : selector(v!)
}
}
return seq
}
Run Code Online (Sandbox Code Playgroud)
我们称之为
let a = myMap([1, 2, 3], { $0 * 2 })
var gen = a.generate()
let v1 = gen.next()
let v2 = gen.next()
Run Code Online (Sandbox Code Playgroud)
它打印
可选(1)
可选(2)
看起来很懒...
编辑#2: …
我很喜欢我的Blend行为,动作和触发器的小集合 - 它们易于使用且功能强大.但我仍然无法弄清楚如何避免在每个元素的基础上应用它们.例如,如果我有这样的行为:
<Rectangle>
<i:Interaction.Behaviors>
<il:MouseDragElementBehavior/>
</i:Interaction.Behaviors>
</Rectangle>
Run Code Online (Sandbox Code Playgroud)
我的窗口中有一些可拖动的矩形,每个矩形都必须具有可拖动的上述标记.我想做的是能够写出这样的东西:
<Style x:Key="RectangleStyle" TargetType="{x:Type Rectangle}">
<Setter Property="i:Interaction.Behaviors"
Value="il:MouseDragElementBehavior"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
它可以是样式,模板或其他一些避免行为或动作标记重复的方法.到目前为止我提出的最佳解决方案是为容器创建一个特殊的行为(当附加时,它枚举附加到子事件的子项).有任何想法吗?
我有一个看似合法的函数将数组转换为Dictionary:
func arrayToDictionary<Key : Hashable, Value>
(source: Array<Value>, key: Value -> Key) -> Dictionary<Key, Value> {
var dictionary = Dictionary<Key, Value>()
for element in source {
let key = key(element)
dictionary[key] = element
}
return dictionary
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试调用它时:
let dict = arrayToDictionary([1, 2, 3], { val in return val })
Run Code Online (Sandbox Code Playgroud)
我收到一个错误 - 无法转换表达式的类型'($ T6,(($ T9) - >($ T9) - > $ T8) - >(($ T9) - > $ T8) - > $ T8)'到类型'Hashable'
奇怪的是,如果我使用隐式回报:
let dict = arrayToDictionary([1, 2, 3], …Run Code Online (Sandbox Code Playgroud) mtcars %>% select(mpg, cyl) %>% group_by(cyl) %>% arrange(mpg) %>% slice(8)
Run Code Online (Sandbox Code Playgroud)
输出
mpg cyl
<dbl> <dbl>
1 30.4 4
2 15.2 8
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它不会产生6个柱面的行 - 即使合并为空,建议保留所有组的方法是什么?
下面的XAML不起作用(鼠标悬停时文本不会改变):
<Window.Resources>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Text" Value="hover"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBlock Text="original"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是,如果缺少Text属性:
<Grid>
<TextBlock/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
鼠标悬停时文本会发生变化.有人知道这背后的理论吗?
在我们的产品中,我们使用MVVM模型的第一种方法,它很好地工作,但有一点需要注意.当视图变得复杂时,从数据模板创建它需要时间.如果经常显示和隐藏视图,它会变得有点刺激.如果首先使用视图,那么在需要时缓存视图会很容易 - 但是当首先使用DataTemplate和模型时,我们对视图创建没有太多控制.有没有人在没有切换到第一种方法的情况下解决了这个问题?
我很好奇是否有人编写任何代码反映到一个类并找到它的Deprecated方法?
我已经掀起了T4模板的反应,并希望让它停止为已弃用的事件生成处理程序,任何聪明的黑客已经打败了我?