[英]How to remove the execution of a method from a ViewModel - Xamarin.Forms - MVVM
[英]Xamarin.Forms set focus from mvvm ViewModel
我正在使用 Xamarin.Forms 開發聊天應用程序。
我想避免在 Entry 失去焦點並單擊 Send 按鈕時隱藏鍵盤。
如何在 Android 和 iOS 上執行此操作?
我使用 XF,沒有 XAML 的完整 Mvvm(僅 C#)
更新:
在頁面類中:
private EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{
TextColor = Color.Black,
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.End,
Margin = new Thickness(0, 0, 5, 0)
};
在模型類中:
var entry = CurrentPage.FindByName<EntrySetBorder>("_newMessageEntry");
entry.Focus();
}
這可以通過使用 PCL 中的FindByName<>()
函數輕松實現。
這是這樣做的一種方法:
Entry myEntry = CurrentPage.FindByName<Entry>("YourEntryName");
myEntry.Focus();
您可以將其添加到發送按鈕的點擊處理程序的末尾。
在您的情況下,我認為您的問題是您的條目設置為private
,因此我建議將其public
為public
或使用另一個公共屬性公開它。 兩種可能有效的解決方案:
public EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{
TextColor = Color.Black,
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.End,
Margin = new Thickness(0, 0, 5, 0)
};
和:
EntrySetBorder entry = CurrentPage.FindByName<EntrySetBorder>("_newMessageEntry");
entry.Focus();
或者你用這個:
private EntrySetBorder _newMessageEntry;
...
_newMessageEntry = new EntrySetBorder
{
TextColor = Color.Black,
HorizontalOptions = LayoutOptions.FillAndExpand,
VerticalOptions = LayoutOptions.End,
Margin = new Thickness(0, 0, 5, 0)
};
public EntrySetBorder NewMessageEntry => _newMessageEntry;
和 :
EntrySetBorder entry = CurrentPage.FindByName<EntrySetBorder>("NewMessageEntry");
entry.Focus();
請試試:)
在查看您的代碼並對其進行測試后,修復它的最終方法是將 Entry 作為您正在使用的命令中的參數發送,例如:
在您創建的頁面內:
sendButton.CommandParameter = NewMessageEntry; // We're adding the Entry we want to focus as a command parameter.
在您的 PageModel 和我們要使用的命令中:
public Command SendCommand
{
get
{
return new Command<Entry>((obj) => //obj here means the parameters we're sending I.E: the entry we set it in the page.
{
//The code you want to execute
Entry entry = obj;
entry.Focus();
});
}
}
請注意,我使用Entry
是因為我沒有自定義條目的所有實現。
這是我如何做的一個例子,在此之前我曾經使用 MessagingCenter
在 xaml 中,您需要為要聚焦的 obj 提供一個 x:Name 。
<!-- PICKER's DEFINITION -->
<DatePicker
x:Name="Datepicker"
Date="{Binding SelectedDate, Mode=TwoWay}"
IsEnabled="true"
IsVisible="false">
</DatePicker>
那么您必須在按鈕上的命令參數中引用該控件,或者例如在這種情況下我使用工具欄項。
<!-- MENU TOOLBAR -->
<ContentPage.ToolbarItems>
<ToolbarItem
Command="{Binding ShowCalendarCommand}"
Icon="Calendar"
CommandParameter="{x:Reference Datepicker}" />
</ContentPage.ToolbarItems>
然后在你的 vm 命令中:
#region toolbar commands
public ICommand ShowCalendarCommand => new RelayCommand<Object>(ShowCalendar);
#endregion
private void ShowCalendar(Object obj)
{
var calendar = (DatePicker)obj;
calendar.Focus();
// MessagingCenter.Send(this, "Calendar");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.