如果您堅持使用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