আমি এক্সএএমএল-এর ডেটা কনটেক্সট সম্পত্তি ব্যবহার করে একটি উইন্ডোতে একটি ভিউমোডেল কীভাবে সেট করব?


96

প্রশ্ন বেশ সব কিছু বলে।

আমার একটি উইন্ডো আছে, এবং ভিউমোডেলটিতে পুরো নেমস্পেসটি ব্যবহার করে ডেটা কনটেক্সট সেট করার চেষ্টা করেছি, তবে মনে হচ্ছে আমি কিছু ভুল করছি।

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="BuildAssistantUI.ViewModels.MainViewModel">

মাইক নাকিসকে অনুসরণ করে, আমি নিজেই ভিউমোডেলটি তৈরি করার চেষ্টা করছিলাম এবং এতে ইভেন্টগুলিতে সাবস্ক্রাইব করেছিলাম, কেবল এটি অনুসন্ধান করতে যে ফ্রেমওয়ার্কটি অন্য ভিউমোডেল তৈরি করছে। সুতরাং আমি যে ভিউমোডেলটিতে সাবস্ক্রাইব হয়েছিল সেটি ভিউয়ের সাথে সংযুক্ত ছিল না।
jlady

এই যে viewmodel শুরু করতে গিয়ে নিজেকে ছাড়া তুমি ছিলে তার মানে কি এছাড়াও viewmodel ধরণ অন্য কোন উপায়ে উল্লেখ? কনস্ট্রাক্টর প্যারামিটারগুলির প্রয়োজনীয় ভিউমোডেলগুলির একটি দ্বিতীয় সুবিধা হ'ল ফ্রেমওয়ার্কটি সেগুলি ইনস্ট্যান্ট করতে পারে না, বা এটি সেই পরামিতিগুলির জন্য ডিফল্ট মানগুলি পাস করতে হয়, সেক্ষেত্রে আপনি ফ্রেমওয়ার্কের মাধ্যমে সহজেই ইনস্ট্যান্টেশন সনাক্ত করতে পারেন।
মাইক নাকিস

এক্সএএমএল ডিজাইনারকে ভিউ মডেলগুলি ইনস্ট্যান্ট করতে সক্ষম হতে পারে, তবে এই ডিজাইনারটি আমার পক্ষে কখনই কোনও উপযোগী ছিল না, (এটি কেবল সমস্যা সৃষ্টি করে) তাই আমি এটি ব্যবহার করি না, তাই ব্যক্তিগতভাবে আমি সেই ব্যবহারের ক্ষেত্রে যত্ন নিই না।
মাইক নাকিস

উত্তর:


113

অন্যান্য লোকেরা যে সমাধান সরবরাহ করেছে (যা ভাল, এবং সঠিক) এর পাশাপাশি এক্সএএমএল-এ ভিউমোডেল নির্দিষ্ট করার একটি উপায় রয়েছে, তবুও নির্দিষ্ট ভিউমোডেলটিকে ভিউ থেকে আলাদা করুন। বিচ্ছিন্ন পরীক্ষার কেসগুলি লিখতে চাইলে এগুলি পৃথক করা কার্যকর।

App.xaml এ:

<Application
    x:Class="BuildAssistantUI.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"
    StartupUri="MainWindow.xaml"
    >
    <Application.Resources>
        <local:MainViewModel x:Key="MainViewModel" />
    </Application.Resources>
</Application>

মেইনওয়াইন্ডো.এক্স্যামেল-এ:

<Window x:Class="BuildAssistantUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{StaticResource MainViewModel}"
    />

ওহ বাহ ... ধন্যবাদ আমি ইতিমধ্যে উত্তর হিসাবে চিহ্নিত, কিন্তু আপনার সংযোজন প্রশংসা করা হয়। এটি ব্যবহার করবে।
নিকোলাস

@ নিকোলাস: অন্য উত্তরটি প্রশ্নের পক্ষে নিখুঁত, তাই আমি আপনার সিদ্ধান্তের সাথে একমত
মার্লিন মরগান-গ্রাহাম

8
কেবল সচেতন থাকুন যে মেইন উইন্ডোর প্রতিটি দৃষ্টান্তের জন্য এই পদ্ধতিটি একই ভিউমোডেল উদাহরণটি ব্যবহার করে। এই ক্ষেত্রেটি যেমন উইন্ডোটি একক দৃষ্টান্ত হিসাবে দেখায় এটি ঠিক আছে তবে আপনি যদি উইন্ডোটির একাধিক উদাহরণ যেমন এমডিআই বা ট্যাবড অ্যাপ্লিকেশনটির ক্ষেত্রে প্রদর্শন করছেন তবে তা নয়।
জোশ

4
আসলে জোশের উত্তরটি আরও ভাল কারণ এটি আপনাকে ডেটা কনটেক্সটে টাইপ-সুরক্ষা দেয়। সুতরাং আপনি কোনও সম্পত্তির নাম / পাথ টাইপ-ইনংয়ের চিন্তা না করে সরাসরি ডেটা কনটেক্সটে বাঁধতে পারেন।
জোশ এম

149

পরিবর্তে এটি চেষ্টা করুন।

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>

4
আমি এই বিকল্পটি সবচেয়ে পছন্দ করি। ক্লিনার মনে হচ্ছে যদি ভিএম কেবল মেইন উইন্ডোর জন্য ব্যবহৃত হয়।
অ্যান্ড্রু গ্রোথ

13
Windowউপাদানটির মতো কোনও অ্যাট্রিবিউট ব্যবহার করে ডেটা প্রসঙ্গ সেট করার কোনও উপায় আছে কি DataContext="VM:MainWindowViewModel"?
অলিভার

এই সঠিক উপায়!
জাভিয়েরিইইচ

আমি কেন পুরোপুরি বুঝতে পারছি না যে একটি উপায় অন্য পদ্ধতির চেয়ে ভাল। এছাড়াও, আমি কিছু লোককে কীভাবে "ডায়নামিক রিসোর্স" ব্যবহার করতে দেখেছি তার তুলনায় আমি এই পদ্ধতির কোনওটির মধ্যে সম্পূর্ণ পার্থক্য দেখতে পাই না। এটা কি?
ট্র্যাভিস টিউবস

4
@Oliver আপনি বাস্তবায়ন করতে হবে MarkupExtension, না এটা ভার্চুয়াল মেশিনের কাজ, কিন্তু আপনি কনভার্টার সঙ্গে এটা করতে পারে রূপান্তরকারী মাত্র এক উদাহরণ হিসেবে বলা যায় নিশ্চিত বর্তমান থাকে এবং সঙ্গে xaml থেকে এটা direcly ডাকতে ="{converters:SomethingConverter}", implying xmlns:convertersরূপান্তরকারী নামস্থান এ পয়েন্ট। public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter where T : class, new() { private static T _converter; public override object ProvideValue(IServiceProvider serviceProvider) { return _converter ?? (_converter = new T()); } }
ওয়াজ

11

আপনাকে মেইনভিউমোডেলটি ইনস্ট্যান্ট করতে হবে এবং এটি ডেটাঅন্টেক্সট হিসাবে সেট করতে হবে। আপনার বিবৃতিতে এটি কেবল স্ট্রিংয়ের মান হিসাবে বিবেচনা করে।

     <Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BuildAssistantUI.ViewModels">
      <Window.DataContext>
        <local:MainViewModel/>
      </Window.DataContext>

ধন্যবাদ, আমি বুঝতে পেরেছিলাম যে এটি করছিল।
নিকোলাস

3

আপনি ক্যাটেল চেষ্টা করতে পারেন । এটি আপনাকে একটি ডেটা উইন্ডো শ্রেণি (উইন্ডোর পরিবর্তে) সংজ্ঞায়িত করতে দেয় এবং সেই শ্রেণিটি স্বয়ংক্রিয়ভাবে আপনার জন্য ভিউ মডেল তৈরি করে। এইভাবে, আপনি নিজের আসল পোস্টে যেমন ভিউমোডেলের ঘোষণাটি ব্যবহার করতে পারেন, তবুও দর্শন মডেলটি তৈরি এবং ডেটা কনটেক্সট হিসাবে সেট করা হবে।

উদাহরণ হিসাবে এই নিবন্ধটি দেখুন ।


3

ভিউ মডেলটি নির্দিষ্ট করার এই উপায়টিও রয়েছে:

using Wpf = System.Windows;

public partial class App : Wpf.Application //your skeleton app already has this.
{
    protected override void OnStartup( Wpf.StartupEventArgs e ) //you need to add this.
    {
        base.OnStartup( e );
        MainWindow = new MainView();
        MainWindow.DataContext = new MainViewModel( e.Args );
        MainWindow.Show();
    }
}

<রেন্ট>

পূর্বে প্রস্তাবিত সমস্ত সমাধানের জন্য MainViewModelঅবশ্যই প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে।

মাইক্রোসফ্টের ধারণা রয়েছে যে প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করে সিস্টেমগুলি তৈরি করা যেতে পারে। আপনি যদি এই ছাপেরও অধীনে থাকেন তবে এগিয়ে যান এবং অন্য কয়েকটি সমাধান ব্যবহার করুন।

যাঁরা জানেন যে কনস্ট্রাক্টরদের অবশ্যই প্যারামিটার থাকতে হবে, এবং সেইজন্য যাদু ফ্রেমওয়ার্কগুলির হাতে অবজেক্টগুলির তাত্ক্ষণিকতা রাখা যায় না, ভিউ মডেলটি নির্দিষ্ট করার সঠিক উপায়টি আমি উপরে দেখিয়েছি।

</Rant>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.