2014-10-06 146 views
0

我正在开发一个带有RGB选择器的MVVM应用程序。我有3个滑块为每个通道和想用路由事件赶上ValueChanged事件于滑块路由事件和命令

<StackPanel Grid.Row="0" Grid.Column="1" Slider.ValueChanged="DoSmth"> 
    <Slider Value="{Binding R}" Minimum="0" Maximum="255" /> 
    <Slider Value="{Binding G}" Minimum="0" Maximum="255" /> 
    <Slider Value="{Binding B}" Minimum="0" Maximum="255" /> 
</StackPanel> 

现在,这beeing一个MVVM应用程序,我想使用命令这一点。但是我看不到找到一种发送命令的方式,而不必将它分别分配给每个滑块。我读了一些关于“Routed Commands”的文章,但是这也没有给我一个解决方案。

我该如何做到这一点?

+0

为什么不添加相同的命令到每个滑块?你不需要任何参数,因为你已经绑定了R,G和B,所以处理命令的方法可以处理这些属性,而不是处理参数。 – Mashton 2014-10-06 16:08:02

+0

它甚至不需要参数,要执行的代码对于Stackpanel中的所有滑块都是相同的。另外我关于可伸缩性,我将需要更多的滑块用于其他参数,这就是为什么我不想要任何冗余代码。 – Xaser 2014-10-06 18:19:06

+0

我说它不需要参数,是的代码对所有滑块都是一样的。这就是为什么我说为每个滑块绑定**相同的命令**,为什么我说**你不需要任何参数**。代码不是多余的:当你移动红色滑块时,你想要发生某些事情。当您移动绿色或蓝色滑块时,您也希望发生同样的事情,那么除非您在这些滑块上连接命令,否则您将如何传达应该发生的事情? – Mashton 2014-10-06 20:17:41

回答

1

如果您坚持使用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"); } 
} 
+0

是的我想我确实可以做到这一点......我害怕循环依赖/更新,因为在'Color'的'set''我已经调用滑块的更新,这就是为什么我直接在颜色'set'handler中设置支持属性...但是我可能会添加一些不影响推子显示的颜色,从而杀死这个解决方案。我会提供另一个解决方案并回报。 – Xaser 2014-10-06 18:24:06