XAML 我如何在MAUI中从我的视图模型中设置焦点到一个条目

avwztpqn  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(152)

我在页面上有一个输入字段和一个选择器元素。在应用程序启动时,用户必须在选择器中选择一个进程,之后焦点应自动位于输入字段中。由于我在ViewModel中对Picker元素进行了评估(通过RelayCommand),因此我有一个问题,如果是这样,我是否以及如何从VM设置焦点。
我的xaml文件:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Mahle_ScannerApp_V3.MainPage"
         xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
         xmlns:viewmodel="clr-namespace:Mahle_ScannerApp_V3.ViewModels"
         x:DataType="viewmodel:MainViewModel">
    <VerticalStackLayout>
        <Image Source="logfox_logo_small.png"
            WidthRequest="200"
            Margin="0,10,0,0"/>

        <Picker Title="Vorgang auswählen"
                WidthRequest="270"
                HorizontalTextAlignment="Center"
                Margin="0,10,0,0"
                FontSize="20"
                TextColor="OrangeRed"
                x:Name="piProcess"
                ItemsSource="{Binding ScanProcesses}">
            <Picker.Behaviors>
                <toolkit:EventToCommandBehavior 
                    EventName="SelectedIndexChanged"
                    Command="{Binding PiProcessItemChangedCommand}"
                    CommandParameter="{Binding Source={x:Reference piProcess},     
                        Path=SelectedIndex}"/>
            </Picker.Behaviors>
        </Picker>
        <Label x:Name="lblBarcodeOne"
               Text="{Binding LblBarcodeText}"
               FontSize="22"
               Margin="0,20,0,0"
               HorizontalTextAlignment="Center"/>

        <Border Stroke="#000000"
                Margin="0,10,0,0"
                StrokeThickness="2"
                StrokeShape="RoundRectangle 20,20,20,20"
                Background="#C1CDC1"
                Padding="8,8,8,8"
                HorizontalOptions="Center">
            <Entry 
                   x:Name="entryBarcode"
                   Text="{Binding EntryBarcodeText}"
                   WidthRequest="270"
                   FontSize="20"
                   TextColor="#838b83"
                   HorizontalOptions="Center">
                <Entry.Behaviors>
                    <toolkit:EventToCommandBehavior 
                        EventName="TextChanged"
                        Command="{Binding TextEntryChangedCommand}"
                        CommandParameter="{Binding Source={x:Reference entryBarcode}, 
                            Path=Text}"/>
                </Entry.Behaviors>
            </Entry>
        </Border>
    </VerticalStackLayout>
</ContentPage>

我的视图模型(代码段)

...
[RelayCommand]
async Task PiProcessItemChanged(object data) {
    ProcessType = Convert.ToInt32(data);
    if(ProcessType.Equals(0)) {
        LblBarcodeText = labelText[1];
    } else {
        LblBarcodeText = labelText[2];
    }
    
}

itemchanged事件起作用。但是现在必须在输入字段中设置一个焦点,我在MVVM领域还是个新手,因此我不知道如何实现它。

smdnsysy

smdnsysy1#

这个逻辑是UI的一部分,可以放在后面的代码中。
这里有一个例子,你可以订阅更改文本事件并处理它。如果保存BindingContext的引用,则仍然可以使用ViewModel属性。
希望能有所帮助

public partial class MainPage : ContentPage
{
    private readonly MainViewModel _viewModel;
    public MainPage(MainViewModel mainViewModel)
    {
        InitializeComponent();
        BindingContext = _viewModel = mainViewModel;

        entryBarcode.TextChanged += EntryBarcodeOnTextChanged;
    }

    private void EntryBarcodeOnTextChanged(object sender, TextChangedEventArgs e)
    {
        var processType = e.NewTextValue;
        if (processType.Equals(0))
        {
            lblBarcodeOne = _viewModel.LabelText[1];
        }
        else
        {
            lblBarcodeOne = _viewModel.LabelText[2];
        }
    }
    
}

相关问题