加载视图时Xamarin Forms bool绑定不工作

wpx232ag  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(129)

我有一个简单的视图,在一个地方显示两个条形码。为此,我使用ZXing库。这个想法是在这两个条形码之间切换可见性。所以当视图加载时,它应该显示一个条形码,点击按钮后,它应该切换到另一个。
因此,这两个条形码都有IsVisible属性绑定到ViewModel属性。一个设置为true,另一个设置为false。
问题是视图加载后没有可见的条形码,只有在单击按钮后才开始工作。因此,逻辑和绑定正常,但视图在第一次运行时没有显示任何内容。
视图模型(简化):

private bool _IsQR;
    public bool IsQR
    {
        get => _IsQR;
        set
        {
            SetProperty(ref _IsQR, value);
        }
    }

    private bool _Is128;
    public bool Is128
    {
        get => _Is128;
        set
        {
            SetProperty(ref _Is128, value);
        }
    }

    public ICommand ToogleCode { private set; get; }

    public BarcodeViewModel()
    {
        IsQR = false;
        Is128 = true;
        ToogleCode = new Command(ToogleCodeHandler);
    }

    private void ToogleCodeHandler()
    {
        Is128 = !Is128;
        IsQR = !IsQR;
    }

视图(简化):

<Grid x:DataType="vm:BarcodeViewModel">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <Label Grid.Row="0" Text="{Binding Code}" 
               LineBreakMode="NoWrap"
               HorizontalOptions="Center" 
               VerticalOptions="Center"
               FontSize="Large"
               FontAttributes="Bold"
               Padding="0,0,0,10"/>

        <Button Grid.Row="1" Text="Change" Command="{Binding ToogleCode}"/>

        <zxing:ZXingBarcodeImageView Grid.Row="2"
                                     BarcodeValue="{Binding Code}" 
                                     BarcodeFormat="QR_CODE" 
                                     IsVisible="{Binding IsQR, Mode=TwoWay}">
            
            <zxing:ZXingBarcodeImageView.BarcodeOptions>
                <zxcm:EncodingOptions Width="500" Height="500" />
            </zxing:ZXingBarcodeImageView.BarcodeOptions>
            
        </zxing:ZXingBarcodeImageView>

        <zxing:ZXingBarcodeImageView Grid.Row="2"
                                     BarcodeValue="{Binding Code}" 
                                     BarcodeFormat="CODE_128"
                                     Rotation="90"
                                     VerticalOptions="Center"
                                     HorizontalOptions="Center"
                                     IsVisible="{Binding Is128, Mode=TwoWay}">
            
            <zxing:ZXingBarcodeImageView.BarcodeOptions>
                <zxcm:EncodingOptions Width="1920" Height="1080" />
            </zxing:ZXingBarcodeImageView.BarcodeOptions>
            
        </zxing:ZXingBarcodeImageView>

    </Grid>

这不是我第一次看到这个。有一次我填充CollectionView,它没有显示任何东西,直到我在ViewModel的OnAppearing()事件中设置了一个属性。但在这里我不能使它工作。
编辑:它不仅适用于条形码(128)。如果我设置QR = true和128 = false,它会正常工作。因此,问题与ZXingBarcodeImageView相关

egdjgwm8

egdjgwm81#

我做了一个示例来测试,当我点击按钮时,命令Binding不起作用。如果你想在你的按钮中使用命令Binding,你可以使用eventtocommandbehavior类。我想你也许可以在你的视图中使用ButtonClicked Event,例如:

MainViewModel viewModel;

public MainPage()

{

InitializeComponent();

viewModel = (MainViewModel)this.BindingContext;

}
private void Button_ Clicked(object sender, EventArgs e)

{

viewModel. IsQR = ! viewModel.IsQR;

viewModel. Is128 = ! viewModel.Is128;

}
s8vozzvw

s8vozzvw2#

为bool值给予默认值:

public BarcodeViewModel()
    {
        Is128 = True;
        IsQR = False;
        ToogleCode = new Command(ToogleCodeHandler);
    }
epfja78i

epfja78i3#

我有解决方案。问题不在数据绑定,而是在ZXingBarcodeImageView元素。看起来当Background属性不为空时,它可以正常工作。所以数据绑定是可以的。
我无法删除此问题。

相关问题