[英]Binding a control to multiple properties in WPF
首先,我對這個問題是否愚蠢表示歉意,但是我是WPF的新手,並且在某些控件上遇到了一些困難。
我有一個圖像編輯器應用程序,該應用程序具有多個圖像縮小控件,例如反轉,旋轉,縮放,亮度和對比度。
要編輯控件,用戶選擇他們想要編輯的控件,例如亮度,並且滑塊會出現在圖像的側面(否則將被隱藏)。
該滑塊當前直接綁定到我的ViewModel for Brightness中的屬性。
我希望能夠重用此Slider控件,但可以動態設置綁定,因此例如當我選擇Zoom控件時,同一滑塊將更改Zoom等。
我是否應該使用某種空屬性,它是指向另一個屬性的指針,可以在需要時將其交換出來?
我對WPF並不熟悉,但是我敢肯定有一種更為整潔的方式來進行排序。
任何幫助將不勝感激。
目前我所看到的是這樣。
XMAL滑塊控件
<Slider Grid.Row="0" IsSelectionRangeEnabled="True" SelectionStart="50" SelectionEnd="150" Grid.Column="1" Orientation="Vertical" Minimum="0" Maximum="200" Value="{Binding Brightness}" Visibility="{Binding IsBrightnessAndContrastEnabled, Converter={StaticResource VisibilityConverter}}">
IsBrightnessAndContrastEnabled很簡單,可以決定是否顯示滑塊,
private int _brightness = 100;
public int Brightness
{
get { return _brightness;}
set
{
if (_brightness != value)
{
Set(() => Brightness, ref _brightness, value);
ChangeBrightnessAndContrastCommand.Execute(null);
}
}
}
首先,我同意Silvermind的觀點,最好將其放在不同的滑塊中。 但是要回答您的問題,是的,您要的是可能的。 您只需要一個用於兩個屬性的滑塊。 最好的方法是通過創建負責更改亮度,對比度的第三個屬性來在視圖模型中進行邏輯處理。 讓我將此屬性稱為值:
public int Value
{
get
{
return _value;
}
set
{
if (_value != value)
{
Set(() => Value, ref _value, value);
ApplyChanges(_value);
}
}
}
每次“值”更改時,它將調用方法ApplyChanges,這將根據選擇的控件來更新您的亮度或對比度。
void ApplyChanges(int value)
{
if(_selectedControl.Equals("brightness") && this.Brightness != value)
this.Brigtness = value;
else if(_selectedControl.Equals("contrast") && this.Contrast != value)
this.Contras = value;
}
您說用戶將選擇他們喜歡使用的控件。 因此,所選控件本身是我們需要跟蹤的另一個屬性。 您需要在視圖模型中知道選擇了哪個控件,以便知道每當值更改時應該更新哪個控件(亮度/對比度)。 在我的示例中,為了簡單起見,我將只使用一個字符串,這將告訴視圖模型選擇了哪個。
public string SelectedControl
{
get { return _selectedControl;}
set
{
if (_selectedControl != value)
{
Set(() => Contrast, ref _selectedControl, value);
if(_selectedControl.Equals("brightness"))
this.Value = this.Brightness;
else if(_selectedControl.Equals("contrast"))
this.Value = this.Contrast;
}
}
}
每次所選控件更改時,如果用戶選擇另一個控件,我們將更新Value屬性並傳遞當前所選控件的值。 當用戶將對比度設置為3,然后將亮度設置為20,然后再次選擇對比度時,滑塊值應回到3或相反的值。 每次更改選定控件時,滑塊中的值也會更新。
最后,您需要將屬性Value綁定到Slider的值。
我將使用多個Sliders,但為它們創建一個單獨的Style,其中包含所有共享屬性。 這樣可以減少代碼並使其更易於閱讀/維護。
<Style x:Key="MySliderStyle" TargetType="{x:Type Slider}">
<Setter Property="IsSelectionRangeEnabled" Value="True" />
<Setter Property="SelectionStart" Value="0" />
<Setter Property="SelectionEnd" Value="150" />
<Setter Property="Orientation" Value="Vertical" />
<Setter Property="Minimum" Value="0" />
<Setter Property="Maximum" Value="200" />
</Style>
<Slider Style="{DynamicResource MySliderStyle}" Grid.Row="0" Grid.Column="1"
Value="{Binding Brightness}" Visibility="{Binding IsBrightnessAndContrastEnabled, Converter={StaticResource VisibilityConverter}}">
但是,如果確實要使用同一滑塊,則可以動態更改分配給Slider控件的Style,並讓不同的Styles定義Binding和Visibility值。
<Style x:Key="BrightnessSlider" TargetType="{x:Type Slider}" BasedOn="{DynamicResource MySliderStyle}">
<Setter Property="Value" Value="{Binding Brightness}" />
<Setter Property="Visibility" Value="{Binding IsBrightnessAndContrastEnabled, Converter={StaticResource VisibilityConverter}}" />
</Style>
<Slider x:Name="MySingleSlider" Grid.Row="0" Grid.Column="1">
以及在后面的代碼中或在切換滑塊用途時使用的代碼:
MySingleSlider.Style = this.FindResource("BrightnessSlider") as Style;
您還可以結合這兩種方法並按照#2中的定義創建樣式,但是像#1中那樣在XAML中使用單獨的Sliders。 這樣一來,您的XAML就會變得更加簡單,並且可以為每個滑塊自定義其樣式的屬性。
<Slider Style="{DynamicResource BrightnessSlider}" Grid.Row="0" Grid.Column="1">
(您也可以將Grid.Row
和Grid.Column
屬性放在<Style>
,但是通常它們與您關聯,但是您要布置控件,因此我更喜歡將這些屬性保留在Control上)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.