2017-08-28 26 views
0

我有一個類ImageButton:Grid並且想要檢測其變化IsEnabled屬性。有沒有一種基於事件的方式來做到這一點?如何檢測對視覺元素內置屬性的更改? - Xamarin Forms

PropertyChanged事件在這裏看起來並不相關。

.NET有IsEnabledChanged,但似乎也不適用。

背景:我的課實現了一個可點擊的圖像覆蓋文本,作爲一個按鈕。這是一個單格柵格,上面覆蓋了一個圖像,上面覆蓋了一個標籤。當ImageButton對象被禁用時,我需要減少標籤和圖像的不透明度。當然,我可以簡單地添加一個屬性來做到這一點,但是無法輕鬆地將該類用作插入到使用Button的現有代碼的插件。

備註:Button不提供BackgroundImage屬性有點讓人困惑 - 許多開發人員都需要這樣做。

+0

我相信,除非我明白你要找什麼不好因爲,PropertyChanged實際上就是你所需要的,因爲PropertyChangedEventArgs提供了你已經改變的屬性的名稱:https://developer.xamarin.com/api/type/System.ComponentModel.PropertyChangedEventArgs/ – Kinxil

+0

可能相關的https:/ /forums.xamarin.com/discussion/20040/disabled-button-style ...他們使用'PropertyChanged'事件和一個額外的風格,以完成非常相似的事情...檢查NinoStella的帖子。 – Hackerman

回答

1

您可以在家長控制簡單覆蓋OnPropertyChanged更新內部控制(S):

protected override void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    base.OnPropertyChanged(propertyName); 

    if(propertyName == nameof(IsEnabled)) 
    { 
     //update controls here 
     ... 
    } 
} 

但我寧願建議您使用轉換器,同時結合你的內部控制的Opacity到父母的IsEnabled財產

例如,如果你在C#中定義您的自定義控制,您可以定義綁定爲:

public class ImageButton : Grid 
{ 
    private static readonly BooleanToOpacityConverter _converter = new BooleanToOpacityConverter(); 
    public ImageButton() 
    { 
     var label = new Label { Text = "ImageButton" }; 
     var image = new Image { Source = ImageSource.FromFile("icon.png") }; 

     // add binding to Opacity using IsEnabled from parent 
     label.SetBinding(OpacityProperty, new Binding("IsEnabled", converter: _converter, source: this)); 
     image.SetBinding(OpacityProperty, new Binding("IsEnabled", converter: _converter, source: this)); 

     ColumnDefinitions = new ColumnDefinitionCollection { new ColumnDefinition(), new ColumnDefinition() }; 

     SetColumn(label, 1); 
     Children.Add(label); 
     Children.Add(image); 
    } 
} 

或者,如果你正在使用XAML基於自定義的控制,你可以指定你的綁定爲:

<Grid xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:UpdateSourceTriggerApp" 
    x:Name="_parent" 
    x:Class="UpdateSourceTriggerApp.ImageButton2"> 
<Grid.Resources> 
    <ResourceDictionary> 
    <local:BooleanToOpacityConverter x:Key="_converter" /> 
    </ResourceDictionary> 
</Grid.Resources> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition /> 
    <ColumnDefinition /> 
</Grid.ColumnDefinitions> 

<Image Source="icon.png" Opacity="{Binding Source={x:Reference _parent}, Path=IsEnabled, Converter={StaticResource _converter}}" /> 
<Label Text="ImageButton2" Grid.Column="1" Opacity="{Binding Source={x:Reference _parent}, Path=IsEnabled, Converter={StaticResource _converter}}" /> 
</Grid> 

樣品轉換器看起來像:

public class BooleanToOpacityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var isEnabled = (value == null) ? false : (bool)value; 
     return isEnabled ? 1 : 0.5; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+1

我使用了綁定方法@Sharada Gururaj。完美的作品,非常感謝! – BillF