簡體   English   中英

將控件綁定到WPF中的多個屬性

[英]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.RowGrid.Column屬性放在<Style> ,但是通常它們與您關聯,但是您要布置控件,因此我更喜歡將這些屬性保留在Control上)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM