سؤال

أنا بدأت مع MVVM، وبدأت في فهم الأشياء. أنا أجريت حاليا مع إطار Cinch، على الرغم من أنني لست ملتزما بذلك حتى الآن.
لقد قمت بحقن ViewModels في الآراء باستخدام الإشارة إلى مرجع إلى ViewModel في CodeBehind لعرض العرض، مع وجود الخاصية [تبعية] على ذلك، وفي SETTER، يقوم بتعيين DataContext إلى العرض الصحيح، باستخدام الوحدة. خدعة أنيقة، فكرت.

أحاول الحصول على تطبيقي للعمل كإطار واحد، مع وجهات نظر محقونة (بدلا من نوافذ متعددة والتعامل مع فتح إغلاقها) قمت بتغيير وجهات نظري من Windows إلى UserControls، وأضاف إلى النافذة الرئيسية. التي عملت، لكن ViewModel لم يتم حقنه أبدا، من المفترض أن XAML لا يستخدم الحاوية.الركول لإنشاء طريقة العرض، كما هو الحال عندما قمت بإنشاء طريقة العرض وإضافتها يدويا في الكود، تم إنشاء [التبعية] وبعد

كيف يمكنني إعداد نافذتي، بحيث إذا أضفت عرضا عبر XAML، أو يتم تغيير العرض نتيجة لعمل UI وما إلى ذلك، فإنه يحصل عليه من خلال الوحدة، بحيث يمكن أن تعمل سحرها؟

هل كانت مفيدة؟

المحلول

الطريقة التي لحل مشكلتك هي جعل نافذتك للحصول على عرض عرضية أيضا، مع تعرض ViewModels of Usercontrols كخصائص عليه. ثم في XAML الخاص بك للحصول على نافذة، ستحمل ببساطة آلية ملزمة لربط DataContext TataContext في الخصائص المناسبة ل ViewModel الرئيسية الخاصة بك. وبذلك يتم حل المشاهدة الرئيسية الرئيسية من حاوية الوحدة، سيكون له كل حقن ViewModel-s الأخرى حسب الحاجة.

نصائح أخرى

عادة ما يتم حل هذه المشكلة باستخدام المناطق والمنطقة. في النافذة الرئيسية ViewModel، يتم إنشاء مجموعة من المناطق وإضافتها إلى المنطقة. ثم يمكن حل ViewModels وإضافتها إلى Colory.views Collection.

في XAML، يتم حقن المنطقة عادة من خلال وجود خاصية Obectsource الخاصة ب OindControl مرتبطة بممتلكات المنطقة من ViewModel الرئيسية.

لذلك، في الشاشة الرئيسية ViewModel سيكون لديك شيء مثل هذا:

    public class TestScreenViewModel
{
    public const string MainRegionKey = "TestScreenViewModel.MainRegion";

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager)
    {
        this.MainRegion = new Region();
        regionManager.Regions.Add(MainRegionKey, this.MainRegion);
    }

    public Region MainRegion { get; set; }
}

سيتم حل هذا بشكل طبيعي في imodule الخاص بك

        #region IModule Members

    public void Initialize()
    {
        RegisterViewsAndServices();

        var vm = Container.Resolve<SelectorViewModel>();
        var mainScreen = Container.Resolve<TestScreenViewModel>();
        mainScreen.MainRegion.Add(vm);

        var mainView = ContentManager.AddContentView("Test harness", mainScreen);
    }

    #endregion

وتمثيل XAML لقالب الخاص بك يبحث عن شيء مثل

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top