如果您坚持使用ICommand
,那么您应该使用附加属性包装Slider.ValueChanged
事件。您可以在我对What's the best way to pass event to ViewModel?问题的回答中找到如何做到这一点。
但是,你真的不应该需要使用任何ICommand
......每当视图模型中的每个数据绑定属性发生变化时,你当然可以创建一个新的Color
?此示例使得用户能够改变颜色,而无需使用任何ICommand
S:
<StackPanel Grid.Row="0" Grid.Column="1">
<Slider Value="{Binding R}" Minimum="0" Maximum="255" />
<Slider Value="{Binding G}" Minimum="0" Maximum="255" />
<Slider Value="{Binding B}" Minimum="0" Maximum="255" />
<Rectangle HorizontalAlignment="Stretch" Height="100">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Color}" />
</Rectangle.Fill>
</Rectangle>
</StackPanel>
鉴于模型:
private byte r = 127, g = 127, b = 127;
public byte R
{
get { return r; }
set { r = value; Color = Color.FromArgb((byte)255, R, G, B); NotifyPropertyChanged("R"); }
}
public byte G
{
get { return g; }
set { g = value; Color = Color.FromArgb((byte)255, R, G, B); NotifyPropertyChanged("G"); }
}
public byte B
{
get { return b; }
set { b = value; Color = Color.FromArgb((byte)255, R, G, B); NotifyPropertyChanged("B"); }
}
private Color color = Colors.Black;
public Color Color
{
get { return color; }
set { color = value; NotifyPropertyChanged("Color"); }
}
为什么不添加相同的命令到每个滑块?你不需要任何参数,因为你已经绑定了R,G和B,所以处理命令的方法可以处理这些属性,而不是处理参数。 – Mashton 2014-10-06 16:08:02
它甚至不需要参数,要执行的代码对于Stackpanel中的所有滑块都是相同的。另外我关于可伸缩性,我将需要更多的滑块用于其他参数,这就是为什么我不想要任何冗余代码。 – Xaser 2014-10-06 18:19:06
我说它不需要参数,是的代码对所有滑块都是一样的。这就是为什么我说为每个滑块绑定**相同的命令**,为什么我说**你不需要任何参数**。代码不是多余的:当你移动红色滑块时,你想要发生某些事情。当您移动绿色或蓝色滑块时,您也希望发生同样的事情,那么除非您在这些滑块上连接命令,否则您将如何传达应该发生的事情? – Mashton 2014-10-06 20:17:41