ভিউমোডেল-এ একটি বুল মানটির সাথে একটি বোতামের দৃশ্যমানতা বাঁধাই


122

আমি কীভাবে আমার ভিউমোডেলে একটি বুলিটির একটি মান মানকে বাঁধতে পারি?

<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}"
    Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand"
    Visibility="{Binding Path=AdvancedFormat}" />

উত্তর:


204

অনুমান করা AdvancedFormatহয় যে bool, আপনাকে একটি ঘোষণা এবং ব্যবহার করতে হবে BooleanToVisibilityConverter:

<!-- In your resources section of the XAML -->
<BooleanToVisibilityConverter x:Key="BoolToVis" />

<!-- In your Button declaration -->
<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}" 
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat, Converter={StaticResource BoolToVis}}"/>

যুক্ত নোট করুন Converter={StaticResource BoolToVis}

এমভিভিএমের সাথে কাজ করার সময় এটি একটি খুব সাধারণ প্যাটার্ন। তত্ত্ব আপনি নিজেকে ViewModel সম্পত্তি রূপান্তর করতে পারে (যেমন ঠিক সম্পত্তি নিজেই ধরনের করা Visibility) যদিও আমি যে কি না পছন্দ করেন, এখন আপনি যেহেতু করছে উদ্বেগ বিচ্ছেদ সঙ্গে তালগোল পাকানো। একটি আইটেমের দৃশ্যমানতা দৃশ্য পর্যন্ত হওয়া উচিত।


2
@ raym0nd শিওর ভিউমোডেল কেবল একটি বুলিয়ান দেয়, একটি শর্ত নির্দেশ করে। আপনার ভিউ যদি সেই বুলেটটিকে কিছু দেখাতে বা না দেখায় তা ব্যাখ্যা করে তবে তা দেখার বিষয়। নোট করুন যে অন্য ভিউ এখনও এটি আলাদাভাবে ব্যাখ্যা করতে পারে।
dlev

2
হ্যাঁ, এটি কেবলমাত্র একটি সহায়ক শ্রেণি যা একটি মানকে ম্যাসেজ করে। ভিউ মডেলটি এখনও আপনার মডেল এবং আপনার দর্শনের মধ্যে বসে থাকবে।
কোডওয়ারিওর

2
এছাড়াও, মনে রাখবেন যে এমভিভিএম একটি ডিজাইনের ধরণ, এবং সুতরাং এটির প্রয়োগের জন্য আপনাকে নিজের নিয়ম প্রয়োগ করতে হবে। অতিরিক্তভাবে এমন সময়গুলি আসবে যখন কোনও কিছু সম্পাদন করার একমাত্র উপায় মডেল, ভিউমোডেল বা ভিউ এর এক্সএএমএল অংশের বাইরে থাকবে be কোডবিহাইডে কিছু রাখা পাপ নয় is যদি সম্ভব হয় তবে ভিউমোডেলে এটি রাখা এমভিভিএম প্যাটার্নের সাথে সামঞ্জস্যপূর্ণ।
কোডওয়ারিওর

3
ব্যক্তিগতভাবে, আমার ভিউমোডেলগুলিতে ভিজিবিলিটি ধরণের একটি সম্পত্তি রাখলে আমার আপত্তি নেই। আমি জানি যে এটি আমার বিদ্রোহী, তবে আমার কাছে এটি একটি দৃশ্যকে আরও নমনীয়তা দেয়, কম নয়। যদি কোনও ভিউ এটি ব্যবহার করতে না চায়, এটির দরকার নেই এবং যদি এটি হয় তবে এটি রূপান্তরকারী বা শৈলীর ট্রিগারগুলির সাথে খেলার ব্যথাটি কেটে দেয়। হ্যাঁ, এই বন্ধন একটি উপস্থাপনা প্রযুক্তি আমার ViewModel (WPF বনাম ASP.Net MVC, উদাহরণস্বরূপ) একটি বিট, কিন্তু আমি কদাপি তাহলে সে প্রযুক্তি মিশ্রিত করা এবং যদি আমি কখনো refactoring প্রয়োজন না আমাকে ভীতি নয়, অনেক।
জ্যাকব প্রোফিট 21

1
বুলিয়ানটোভিজিবিলিটি কনভার্টরটি বর্তমানে উইন্ডোজ ফোন ইউআই-তে উপলব্ধ নয়, তবে এই উত্তরটি একটি বাস্তবায়ন প্রদান করেছে stackoverflow.com/a/20344739/595473
CosworthTC

97

তৃতীয় উপায় আছে যার জন্য আপনার রূপের মডেলটিতে কোনও রূপান্তরকারী বা পরিবর্তনের প্রয়োজন নেই: একটি শৈলী ব্যবহার করুন:

<Style TargetType="Button">
   <Setter Property="Visibility" Value="Collapsed"/>
   <Style.Triggers>
      <DataTrigger Binding="{Binding IsVisible}" Value="True">
         <Setter Property="Visibility" Value="Visible"/>
      </DataTrigger>
   </Style.Triggers>
</Style>

আমি এই কৌশলটিকে প্রাধান্য দিই কারণ আমি এটি অনেক ক্ষেত্রে ব্যবহার করি যেখানে আমি বাধ্য তা বুলিয়ান নয় - উদাহরণস্বরূপ কোনও উপাদানটি DataContextশূন্য না হলে কেবল প্রদর্শিত হয়, বা বহু-রাষ্ট্র প্রদর্শনগুলি প্রয়োগ করে যেখানে বিভিন্ন বিন্যাস প্রদর্শিত হয় তার উপর ভিত্তি করে ভিউ মডেলে একটি এনামের সেটিংস।


5
সাধারণত, আমি মনে করি রূপান্তরকারীরা হ্যাক এবং আমি তাদের পছন্দ করি না। আমি মনে করি এটি ইঞ্জিনিয়ারিং দৃষ্টিকোণ থেকে উপকারিতা এবং কুশলীদের স্বচ্ছ মূল্যায়ন না করে আমার কৌতুকপূর্ণ ব্যক্তিগত রুচির বিষয়, তবে আমি সেগুলি এড়াতে পারি।
রবার্ট রসনি

1
আমি বলতে পারি না যে আমি সেগুলি প্রায়শই ব্যবহার করি। এগুলি একধরনের ফিনিকী (sic?) হতে থাকে। আপনার পোস্টের পরে, আমি মনে করেছি যে আমি আগের প্রকল্পগুলিতে বেশ কয়েকটি শৈলী / ট্রিগার ব্যবহার করেছি ...
কোডওয়ারিওর

আমি একটি দেওয়া হয়েছিল TextBlockযা TextWrapping="Wrap"ছিল। এখন যে মোড়ানো সম্পত্তি এটি সেট করা হয় না।
amit jha

10

বুলিয়ান থেকে দৃশ্যমানতার জন্য সি # তে 2 উপায় রূপান্তর

using System;
using System.Windows;
using System.Windows.Data;

namespace FaceTheWall.converters
{
    class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Boolean && (bool)value)
            {
                return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Visibility && (Visibility)value == Visibility.Visible)
            {
                return true;
            }
            return false;
        }
    }
}

7
ইতিমধ্যে উল্লেখ করা হয়েছে যে, ইতিমধ্যে ডাব্লুপিএফ-তে অন্তর্নির্মিত একটি রয়েছে। আপনার নিজের তৈরি করার দরকার নেই।
জুতো

4

সাধারণত এটি করার দুটি উপায় রয়েছে, একটি রূপান্তরকারী শ্রেণি বা ভিউমডেলে একটি সম্পত্তি যা আপনার জন্য মূলত মানকে রূপান্তর করে।

আমি যদি সম্পত্তির পদ্ধতির সাথে এক রূপান্তর হয় তবে তা ব্যবহার করার ঝোঁক। আপনি যদি এটি পুনরায় ব্যবহার করতে চান তবে রূপান্তরকারীটি ব্যবহার করুন। নীচে, রূপান্তরকারীটির একটি উদাহরণ খুঁজুন:

<ValueConversion(GetType(Boolean), GetType(Visibility))> _
Public Class BoolToVisibilityConverter
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

        If value IsNot Nothing Then
            If value = True Then 
                Return Visibility.Visible
            Else
                Return Visibility.Collapsed
            End If
        Else
            Return Visibility.Collapsed
        End If
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class

একটি ভিউমোডেল সম্পত্তি পদ্ধতি কেবল বুলিয়ান সম্পত্তি মান পরীক্ষা করে দেখতে পারে এবং তার ভিত্তিতে একটি দৃশ্যমানতা ফিরিয়ে আনবে। INotifyPropertyChanged বাস্তবায়ন করতে ভুলবেন না এবং এটি বুলিয়ান এবং ভিজিবিলিটি বৈশিষ্ট্য উভয়কে সঠিকভাবে আপডেট করার জন্য কল করুন।


12
ডাব্লুপিএফ এর মধ্যে ইতিমধ্যে অন্তর্নির্মিত একটি বুলিয়ান টোভিজিবিলিটি কনভার্টার রয়েছে
কোডনেকেড

আমি এটা বুঝতে পারি নি। এটি আসলে এমন কিছু ছিল যা আমি এই দৃশ্যের সাথে মানিয়ে নিতে সম্পাদনা করেছি। যদি একটি প্রাক বিল্ট থাকে তবে আরও ভাল।
কোডওয়্যারিয়র

3

এটি একটি খুব সহজ উপায়ে অর্জন করা যেতে পারে 1. দর্শন এ এটি লিখুন।

<Button HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="30">
<Button.Style>
        <Style TargetType="Button">
                <Setter Property="Visibility" Value="Collapsed"/>
                        <Style.Triggers>
                                <DataTrigger Binding="{Binding IsHide}" Value="True">
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                            </Style.Triggers>
            </Style>
    </Button.Style>

  1. নীচে বুলিয়ান সম্পত্তি যা সত্য / মিথ্যা মান ধারণ করে। নিম্নলিখিত কোড স্নিপেট হয়। আমার উদাহরণে এই সম্পত্তিটি ব্যবহারকারী নোট শ্রেণিতে।

    public bool _isHide = false;
    
    public bool IsHide
    {
    
    get { return _isHide; }
    
    set
        {
            _isHide = value;
                OnPropertyChanged("IsHide");
        }
    } 
  2. এভাবেই ইসহাইড সম্পত্তিটির মান পাওয়া যায়।

    userNote.IsHide = userNote.IsNoteDeleted;

2

দেখুন:

<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}" 
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat}"/>

মডেল দেখুন:

public _advancedFormat = Visibility.visible (whatever you start with)

public Visibility AdvancedFormat
{
 get{return _advancedFormat;}
 set{
   _advancedFormat = value;
   //raise property changed here
}

আপনার কোনও সম্পত্তি পরিবর্তিত ইভেন্ট থাকা দরকার

 protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
        PropertyChanged.Raise(this, e); 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

তারা এভাবে মডেল-ভিউ-ভিউ মডেল ব্যবহার করে

তবে যেহেতু আপনি এটি একটি বুলিয়ান সাথে আবদ্ধ করতে চান তাই আপনার কিছু কনভার্টারের প্রয়োজন হবে। অন্য উপায়টি হ'ল বাহিরের বুলেটিয়ান সেট করা এবং সেই বোতামটি ক্লিক করার পরে আপনার পছন্দসই দৃশ্যমানতার জন্য সম্পত্তি_advanced Format সেট করুন।


private Visibility _advancedFormat = Visibility.visibleএটি UWPধন্যবাদ ধন্যবাদ।
রুবস্ট্যাক ওভারফ্লো

1

উইন্ডোজ 10 15063 উপরে থেকে

উইন্ডোজ 10 বিল্ড 15063 তৈরি করার পরে, "ইমপ্লিপ ভিজিবিলিটি রূপান্তর" নামে একটি নতুন বৈশিষ্ট্য রয়েছে যা ভিজিবিলিটিকে মূলভাবে মূল মূল্যকে আবদ্ধ করে - রূপান্তরকারী ব্যবহারের আর দরকার নেই।

(দেখুন https://social.technet.microsoft.com/wiki/contents/articles/34846.uwp-compiled-binding-windows-10- জন্মদিন- update.aspx#Impected_Visibility_conversion )।

আমার কোড (যা মনে করে যে এমভিভিএম ব্যবহৃত হয়, এবং পাশাপাশি টেম্পলেট 10):

<!-- In XAML -->
<StackPanel x:Name="Msg_StackPanel" Visibility="{x:Bind ViewModel.ShowInlineHelp}" Orientation="Horizontal" Margin="0,24,0,0">
    <TextBlock Text="Frosty the snowman was a jolly happy soul" Margin="0,0,8,0"/>
    <SymbolIcon Symbol="OutlineStar "/>
    <TextBlock Text="With a corncob pipe and a button nose" Margin="8,0,0,0"/>
</StackPanel>

<!-- in companion View-Model -->
public bool ShowInlineHelp // using T10 SettingsService
{ 
    get { return (_settings.ShowInlineHelp); }
    set { _settings.ShowInlineHelp = !value; base.RaisePropertyChanged(); }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.