Xamarin Converter无法处理IsEnabled属性

时间:2018-02-01 10:02:41

标签: c# android ios xamarin.forms converter

我正在使用下面的转换器代码

namespace someAssembly.Converters
{
    public class ValidateTextLengthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (int)value != 0;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool)value ? 1 : 0;
        }
    }
}

这是我的Xaml

命名空间:

xmlns:converter="clr-namespace:someNamepsace.someAssembly.Converters;assembly=someAssembly"

资源:

  <ContentPage.Resources>
     <ResourceDictionary>
         <converter:ValidateTextLengthConverter x:Key="validateLength" />
    </ResourceDictionary>
  </ContentPage.Resources>

用法:(编辑我添加了转换器引用的文本框)

<StackLayout HorizontalOptions="FillAndExpand">
<Label Text="Name:" />
<Entry x:Name="txtName" Text="{Binding Name}" HorizontalOptions="FillAndExpand" />
</StackLayout>

<Button x:Name="btnSave" Text="Save" 
Command="{Binding SaveCommand}"
HorizontalOptions="EndAndExpand" 
BackgroundColor="{x:Static local:ColorResources.ButtonColorTransparent}" 
IsEnabled="{Binding Source={x:Reference txtName},
Path=Text.Length,
Converter={StaticResource validateLength}}"  />

我的主要目的是在文本框长度仍为零时禁用按钮。似乎Converter或IsEnabled没有触发。我的代码有问题吗?

2 个答案:

答案 0 :(得分:1)

哦,嗯,代码没有错。错误发生在我的Bindable属性中,其中值需要初始化。

自:

private string _Name = string.Empty; //<-- needs to be empty or "" string
public string Name
{
    get { return _Name; }
    set { SetProperty(ref _Name, value); }
}

要:

public DelegateCommand SaveCommand { get; private set; }

SaveCommand = new DelegateCommand(SaveItem, canExecute)
        .ObservesProperty(() => this.Name)
        .ObservesProperty(() => this.Title)
        .ObservesProperty(() => this.Description);




public bool canExecute()
{
    return !string.IsNullOrEmpty(this.Name) &&    !string.IsNullOrEmpty(this.Title) && !string.IsNullOrEmpty(this.Description);
}


private async void SaveItem()
    {
       //Put your saving logic here.
    }

但是考虑到工作转换器,我选择使用DelegateCommand,因此我可以检查多个属性的长度。

echo '<td><a class="btn btn-primary" href="wystaw.php?skinName='. $key['weapon']. " "  .$key['skin'] .'">Wystaw</a></td>';

答案 1 :(得分:0)

我认为你应该绑定到可绑定的Text属性,而不是它的长度。 然后你应该修改转换器来处理字符串而不是int。