RoutedEvents and Commands

本文关键字:Commands and RoutedEvents | 更新日期: 2023-09-27 18:25:39

我正在开发一个带有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>

现在,这是一个MVVM应用程序,我想使用命令。然而,如果不将命令单独分配给每个滑块,我无法找到发送命令的方法。我读了一些关于"路由命令"的文章,但这也没有给我一个解决方案。

我怎样才能做到这一点?

RoutedEvents and Commands

如果您坚持使用ICommand,那么您应该使用Attached Property包装Slider.ValueChanged事件。您可以在我对将事件传递给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"); }
}