2017-07-05 40 views
0

MvxDialogFragmentを使用して、アクティビティからデータバインドダイアログを表示しようとしています。私のダイアログViewModelには、次のとおりです。次のようにMvxDialogFragmentを表示する簡単な方法は何ですか?

public class ContainerDialogViewModel : MvxViewModel 
{ 

    public string ShipperName; 

    public void Init(string Name) 
    { 
     ShipperName = Name; 
     LoadData(); 
    } 

    public void LoadData() 
    { 
     Survey = SurveyDataSource.CurrSurvey; 
    } 

    private ShipmentSurvey _Survey; 
    public ShipmentSurvey Survey 
    { 
     get 
     { 
      return _Survey; 
     } 
     set 
     { 
      _Survey = value; 
      RaisePropertyChanged(() => Survey); 
      RaisePropertyChanged(() => Containers); 
     } 
    } 


    public List<ShipmentSurveyContainer> Containers 
    { 
     get 
     { 
      if (Survey == null) 
       return new List<ShipmentSurveyContainer>(); 
      else 
       return Survey.SurveyContainers.ToList(); 
     } 
    } 

} 

MvxDialogFragmentがコード化されている:私の活動で

public class ContainerDialog : MvxDialogFragment<ContainerDialogViewModel> 
{ 
    public override Dialog OnCreateDialog(Bundle savedState) 
    { 
     base.EnsureBindingContextSet(savedState); 

     this.BindingInflate(Resource.Layout.ContainerDialog, null); 

     return base.OnCreateDialog(savedState); 
    } 

} 

を、私はダイアログを起動する最も簡単な方法を把握しようとしています。ここで私が試したものです:

public class SurveyView : MvxActivity 
{ 
    public void ShowContainerDialog() 
    { 
     ContainerDialogViewModel vm = new ViewModels.ContainerDialogViewModel(); 
     vm.Init("Test Name"); 
     var dialogFragment = new ContainerDialog() 
     { 
      DataContext = vm 
     }; 
     dialogFragment.Show(FragmentManager, "Containers"); 
    } 
} 

私は、ビューモデルを作成するための私の方法は異例であるかなり確信しているが、私はそれを行うための別の方法を知りません。最大の問題は、FragmentManagerが間違ったバージョンにキャストされることです。 ShowはAndroid.Support.V4.App.FragmentManagerを探しており、公開されているFragmentManagerはAndroid.App.FragmentManagerです。私はMvxActivityをMvxFragmentActivityに変更しようとしましたが、これは役に立たないようです。誰かが私を正しい方向に向けることができますか?

+0

Dialogsをサポートする新しいプレゼンターが5.1.0に予定されています – Martijn00

+0

@ Martijn00今すぐ動作させる方法はありますか?カスタムプレゼンターなどと同じように?私は、MvxDialogFragmentの実例を高値と低値で検索し、見つけられませんでした。 –

+0

私はこれに取り組んでいます:https://github.com/MvvmCross/MvvmCross/issues/1934 – Martijn00

答えて

1

MvvmCrossが本当にこれをサポートしていませんでしたXamarin hereでそれらを使用するかについての詳細を読んで、私ことができます私がこれを必要としていた別のインスタンスに遭遇しました。機能はそこにあります。解決策を私に指摘してくれた@ Martijn00に感謝します。これは非常に基本的ですが、私はそれが誰かを助けるかもしれないと思います。

マイレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="@style/TableHeaderTextView" 
     android:text="Work Date"/> 
    <MvxDatePicker 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="20dp" 
    local:MvxBind="Value WorkDate" /> 
    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Close" 
     local:MvxBind="Click CloseCommand" /> 
</LinearLayout> 

私のViewModel:

public class HoursDateDialogViewModel : MvxViewModel<EstimateHours> 
{ 
    private readonly IMvxNavigationService _navigationService; 

    public HoursDateDialogViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 

     CloseCommand = new MvxAsyncCommand(async() => await _navigationService.Close(this)); 
    } 

    public override System.Threading.Tasks.Task Initialize() 
    { 
     return base.Initialize(); 
    } 

    public override void Prepare(EstimateHours parm) 
    { 
     base.Prepare(); 
     Hours = parm; 
    } 

    public IMvxAsyncCommand CloseCommand { get; private set; } 

    private EstimateHours _Hours; 
    public EstimateHours Hours 
    { 
     get 
     { 
      return _Hours; 
       } 
     set 
     { 
      _Hours = value; 
      RaisePropertyChanged(() => Hours); 
      RaisePropertyChanged(() => WorkDate); 
     } 
    } 

    public DateTime WorkDate 
    { 
     get 
     { 
      return Hours.StartTime ?? DateTime.Today; 
     } 
     set 
     { 
      DateTime s = Hours.StartTime ?? DateTime.Today; 
      DateTime d = new DateTime(value.Year, value.Month, value.Day, s.Hour, s.Minute, s.Second); 
      Hours.StartTime = d; 
      DateTime e = Hours.EndTime ?? DateTime.Today; 
      d = new DateTime(value.Year, value.Month, value.Day, e.Hour, e.Minute, e.Second); 
      Hours.EndTime = d; 
      RaisePropertyChanged(() => WorkDate); 
     } 
    } 

} 

マイビュー:

[MvxDialogFragmentPresentation] 
[Register(nameof(HoursDateDialogView))] 
public class HoursDateDialogView : MvxDialogFragment<HoursDateDialogViewModel> 
{ 
    public HoursDateDialogView() 
    { 
    } 

    protected HoursDateDialogView(IntPtr javaReference, JniHandleOwnership transfer) 
     : base(javaReference, transfer) 
    { 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var ignore = base.OnCreateView(inflater, container, savedInstanceState); 

     var view = this.BindingInflate(Resource.Layout.HoursDateDialogView, null); 

     return view; 
    } 
} 

これだけです。私は、パラメータオブジェクトを渡して、オブジェクトの一部をMvxDatePickerにバインドすることができます。あなたのSetup.csに最初、このダイアログを表示するためには、次のものが必要です。

private readonly IMvxNavigationService _navigationService; 

    public LocalHourlyViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 
    } 

この注入:ダイアログを開きます。そこから、あなたのviewmodelで

protected override IMvxAndroidViewPresenter CreateViewPresenter() 
    { 
     return new MvxAppCompatViewPresenter(AndroidViewAssemblies); 
    } 

は、あなたが含むコンストラクタを必要としますあなたがそれを扱うことができるナビゲーションサービス。そして最後に、あなたはダイアログを開くためにしなければならないすべては、次のとおりです。

async() => await _navigationService.Navigate<HoursDateDialogViewModel, EstimateHours>(Item); 

私はあなたの呼び出しを待つ持っていてもわからないんだけど、私は例を以下ました。あなたは提供Martijn00 @リンクでより多くの例を見ることができます:

https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/Playground

乾杯を!

0

私はこれが正しい第一歩であったMvxFragmentActivity

にMvxActivityを変更しようとしました。その後、FragmentManagerを渡す代わりに、SupportFragmentManagerを渡してください。あなたがサポートしているライブラリに精通していない場合

、あなたは彼らが、どのように私はそれをやろうとしたとき

+0

提案は正しくコンパイルされ、実行されましたが、ダイアログが表示されたときは空白でした。ビューを膨らませているので、次に何をすべきか分かりません。 –

+1

@ JimWilcox - OnCreateDialogを使用する代わりに、代わりにOnCreateViewをオーバーライドし、そこでレイアウトを膨張させます。 OnCreateDialogを取り除くことができます。詳細については、このコードブロックのコメントを参照してください。https://stackoverflow.com/a/19302991/2754727 – pnavk

関連する問題