2014-10-06 100 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