ডেটা ট্রিগার যেখানে মান নাল নয়?


162

আমি জানি যে আমি একটি সেটর তৈরি করতে পারি যা মানটি নুল হয় কিনা তা পরীক্ষা করে দেখে কিছু করতে পারে। উদাহরণ:

<TextBlock>
  <TextBlock.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding SomeField}" Value="{x:Null}">
          <Setter Property="TextBlock.Text" Value="It's NULL Baby!" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>

তবে আমি কীভাবে "নট" মানটি ... "নট নুল" বা "নট = 3" হিসাবে পরীক্ষা করতে পারি? এক্সএএমএল এ কি সম্ভব?

ফলাফল: আপনার উত্তরের জন্য ধন্যবাদ ... আমি জানতাম আমি একটি মান রূপান্তর করতে পারি (যার অর্থ আমাকে কোডে যেতে হবে, এবং এটি যেমন আশা করেছিলাম খাঁটি এক্সএএমএল হবে না)। তবে, এটি সেই প্রশ্নের উত্তর দেয় যা কার্যকরভাবে "না" আপনি খাঁটি এক্সএএমএলে এটি করতে পারবেন না। নির্বাচিত উত্তরটি অবশ্য এ জাতীয় কার্যকারিতা তৈরির সর্বোত্তম উপায় দেখায় । ভাল সন্ধান।

উত্তর:


42

আমি ডেটা ট্রিগ্রারগুলির সাথে একই সীমাবদ্ধতার মধ্যে চলে এসেছি এবং মনে হচ্ছে আপনি কেবল সাম্যতার জন্য পরীক্ষা করতে পারেন। আমি যে নিকটতম জিনিসটি দেখেছি এটি হতে পারে আপনাকে সমতা ব্যতীত অন্য ধরণের তুলনা করার কৌশল।

এই ব্লগ পোস্টে ডেটাট্রিগারে কীভাবে এলটি, জিটি ইত্যাদির তুলনা করা যায় তা বর্ণনা করে।

ডেবারট্রিগারের এই সীমাবদ্ধতাটি কিছুটা রূপান্তরকারী ব্যবহার করে ডেটাটি একটি বিশেষ মূল্যতে ম্যাসেজ করার জন্য ব্যবহার করা যেতে পারে যা আপনি তার থেকে তুলনা করতে পারেন, যেমন রবার্ট ম্যাক্নির উত্তরে প্রস্তাবিত।


10
মজার বিষয় হল যথেষ্ট পরিমাণে ডেটাট্রিগারের একটি অভ্যন্তরীণ ক্ষেত্র রয়েছে যা এটি সাম্যতার জন্য পরীক্ষা করে কিনা তা নিয়ন্ত্রণ করে। দুর্ভাগ্যক্রমে প্রয়োজনীয় ক্ষেত্রটি পেতে আপনাকে যুক্তিসঙ্গত পরিমাণ প্রতিচ্ছবি করতে হবে। সমস্যাটি হ'ল এটি নেট এর পরবর্তী সংস্করণে ভেঙে যেতে পারে।
কালেব ভেরি

154

আপনি এটির জন্য একটি আইভালিউ কনভার্টার ব্যবহার করতে পারেন:

<TextBlock>
    <TextBlock.Resources>
        <conv:IsNullConverter x:Key="isNullConverter"/>
    </TextBlock.Resources>
    <TextBlock.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeField, Converter={StaticResource isNullConverter}}" Value="False">
                    <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

যেখানে ইসনুলকনভার্টারটি অন্য কোথাও সংজ্ঞায়িত করা হয়েছে (এবং তার নাম স্থানটি রেফারেন্স হিসাবে সেট করা হয়েছে):

public class IsNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException("IsNullConverter can only be used OneWay.");
    }
}

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


6
আমি মনে করি আপনি রূপান্তরকারীটিকে আরও কিছুটা জেনেরিক তৈরি করতে পারেন এবং তুলনা করার জন্য একটি মান পাস করার জন্য কনভার্টারপ্যারামিটার ব্যবহার করতে পারেন (নাল এবং নোট 3 এর সাথে তুলনা উভয়কে সমর্থন করার জন্য
জে সি

এটি আমার জন্য ট্রিট করেছে - একাধিক ট্রিগার ব্যবহার করে এটি এটিকে সুন্দর এবং শক্তিশালী করে তোলে।
বার্টি

149

এটি কিছুটা প্রতারণা তবে আমি কেবল একটি ডিফল্ট স্টাইল সেট করেছি এবং তারপরে যদি মানটি শূন্য হয় তবে ডেটাট্রিগার ব্যবহার করে এটি ওভাররড করব ...

  <Style> 
      <!-- Highlight for Reviewed (Default) -->
      <Setter Property="Control.Background" Value="PaleGreen" /> 
      <Style.Triggers>
        <!-- Highlight for Not Reviewed -->
        <DataTrigger Binding="{Binding Path=REVIEWEDBY}" Value="{x:Null}">
          <Setter Property="Control.Background" Value="LightIndianRed" />
        </DataTrigger>
      </Style.Triggers>
  </Style>

1
এটি আমার দৃশ্যের জন্য সেরা সমাধান! এই উত্তর দেওয়ার জন্য ধন্যবাদ!
স্কট

14
আমি মনে করি না এটি হ্যাক, আপনার এটি অনেক সময় করা দরকার; এবং এটি এটি করার জন্য সবচেয়ে পরিষ্কার উপায়।
akjoshi

3
ডিফল্ট সেটারটি স্টাইল.সেটর ট্যাগ ছাড়াই ব্যবহার করা যায়।
নাসের আসাদি

1
শুধু টিকিট! আমি স্টাইলের মালিকানা নিয়ন্ত্রণে ডিফল্ট রেখে দিয়েছি এবং কেন এটি আমার শৈলীর উপর নজর রাখছে তা বুঝতে পারি না :-) আপনাকে ধন্যবাদ!
রিগার্ড্ট স্টেইন

2
উপায় ভাল উত্তর তারপর একটি রূপান্তরকারী ব্যবহার করে ... সহজ এবং পরিষ্কার।
দাসদাস

27

নাল সাথে তুলনা করুন (যেমন মাইকেল নুনন বলেছেন):

<Style>
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
     </Style.Triggers>
</Style>

নাল নয় (কনভার্টার ছাড়াই) সাথে তুলনা করুন:

<Style>
    <Setter Property="Visibility" Value="Collapsed" />
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
     </Style.Triggers>
</Style>

4
এটি এখন পর্যন্ত সবচেয়ে সোজা সামনের উত্তর। আমি এটা পছন্দ করি!
টিমোথিপি

15

আমি যদি কেবলমাত্র একটি তালিকাগুলি আইটেমটি নির্বাচন করা হয় (যেমন নাল নয়) কেবলমাত্র একটি বোতাম সক্ষম করতে এটি ব্যবহার করছি:

<Style TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="True"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=lvMyList, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

4
কখনও কখনও সর্বাধিক সহজ সমাধান পরিষ্কার দৃষ্টিতে লুকানো থাকে। আমি বিশ্বাস করি, এক্সএএমএল কোডটি উপরে থেকে নীচে পর্যন্ত ব্যাখ্যা করা হয়। এইভাবে, তালিকার ভিউটিতে কোনও উপাদান নির্বাচন না করা হলে প্রথমে বোতামটি সক্ষম করা হবে এবং তারপরে অক্ষম করা হবে। তবে দয়া করে আমাকে বলুন, একবার তালিকার তালিকায় কোনও আইটেম নির্বাচন করা হলে শৈলীটি আপডেট হয়?
froeschli

হ্যাঁ, কোনও তালিকা আইটেম নির্বাচন করা হলে বোতামটি সক্ষম করা হয়।
স্টিভক্যাভ

14

আপনি মাইক্রোসফ্টে এক্সপ্রেসন.ইন্টেরাকশনস.ডিএল এDataTrigger ক্লাস ব্যবহার করতে পারেন যা এক্সপ্রেশন ব্লেন্ডের সাথে আসে ।

কোড নমুনা:

<i:Interaction.Triggers>
    <i:DataTrigger Binding="{Binding YourProperty}" Value="{x:Null}" Comparison="NotEqual">
       <ie:ChangePropertyAction PropertyName="YourTargetPropertyName" Value="{Binding YourValue}"/>
    </i:DataTrigger
</i:Interaction.Triggers>

এই পদ্ধতি আপনার বিরুদ্ধে আরম্ভ করতে পারবেন ব্যবহার GreaterThanএবং LessThanখুব। এই কোডটি ব্যবহার করার জন্য আপনার দুটি ডিএল এর উল্লেখ করা উচিত:

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll


6
<StackPanel.Style>
  <Style>
    <Setter Property="StackPanel.Visibility" Value="Visible"></Setter>
    <Style.Triggers>
      <DataTrigger  Binding="{Binding ElementName=ProfileSelectorComboBox, Path=SelectedItem.Tag}" Value="{x:Null}">
          <Setter Property="StackPanel.Visibility" Value="Collapsed"></Setter>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</StackPanel.Style>

আমি এখানে বিপরীত যুক্তিটি ব্যবহার করেছি ... আমার কম্বোয়েটমটি জনবহুল না হলে আমার স্ট্যাকপ্যানেলটি অদৃশ্যতে সেট করা আছে, এটি বেশ ভালভাবে কাজ করে!


6

বন্ধ করুন! কোন রূপান্তরকারী নেই! আমি এই লোকটির লাইব্রেরিটি "বিক্রয়" করতে চাই না, তবে এক্সএএমএল-এর স্টাফগুলির সাথে তুলনা করতে আমি যতবারই রূপান্তরকারী করতাম তা ঘৃণা করি।

সুতরাং এই লাইব্রেরির সাথে: https://github.com/Alex141/CalcBinding

আপনি এটি করতে পারেন [এবং আরও অনেক কিছু]:

প্রথমত, উইন্ডো / ব্যবহারকারী নিয়ন্ত্রণের ঘোষণায়:

<Windows....
     xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"
>

তারপরে, পাঠ্যবন্ধে

<TextBlock>
      <TextBlock.Style>
          <Style.Triggers>
          <DataTrigger Binding="{conv:Binding 'MyValue==null'}" Value="false">
             <Setter Property="Background" Value="#FF80C983"></Setter>
          </DataTrigger>
        </Style.Triggers>
      </TextBlock.Style>
    </TextBlock>

ম্যাজিক অংশটি হল রূপান্তর: 'MYValue == নাল' বাঁধাই । আসলে, আপনি যে কোনও শর্ত [ডকটির দিকে তাকান] সেট করতে পারেন।

মনে রাখবেন যে আমি তৃতীয় পক্ষের অনুরাগী নই। তবে এই লাইব্রেরিটি নিখরচায়, এবং সামান্য প্রভাব (কেবলমাত্র প্রকল্পে 2 .ডিল যোগ করুন)।


5

আমার সমাধানটি ডেটা কনটেক্সট ইনস্টেন্সে রয়েছে (বা এমভিভিএম ব্যবহার করে ভিউমোডেল)। আমি এমন একটি সম্পত্তি যুক্ত করব যা যদি আমি চাই নাল নট শর্তটি পূরণ না করে তবে এটি সত্য হয়।

    Public ReadOnly Property IsSomeFieldNull() As Boolean
        Get
            Return If(SomeField is Null, True, False)
        End Get
    End Property

এবং উপরের সম্পত্তিতে ডেটাট্রিগারকে বাঁধুন। দ্রষ্টব্য: VB.NET- এ অপারেটরটি অবশ্যই ব্যবহার করবেন কিনা তা নিশ্চিত হন IIF ফাংশনটি, যা নাল বস্তুগুলির সাথে কাজ করে না। তারপরে এক্সএএমএল হ'ল:

    <DataTrigger Binding="{Binding IsSomeFieldNull}" Value="False">
      <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!" />
    </DataTrigger>

3

আপনি যদি এমন কোনও সমাধান খুঁজছেন যা IValueConverter ব্যবহার না করে, আপনি সর্বদা নীচের প্রক্রিয়াটি সহ যেতে পারেন

       <StackPanel>
            <TextBlock Text="Border = Red when null value" />
            <Border x:Name="border_objectForNullValueTrigger" HorizontalAlignment="Stretch" Height="20"> 
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Black" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ObjectForNullValueTrigger}" Value="{x:Null}">
                                <Setter Property="Background" Value="Red" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <TextBlock Text="Border = Green when not null value" />
            <Border HorizontalAlignment="Stretch" Height="20">
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Green" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Background, ElementName=border_objectForNullValueTrigger}" Value="Red">
                                <Setter Property="Background" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <Button Content="Invert Object state" Click="Button_Click_1"/>
        </StackPanel>

2

কনভার্টার:

public class NullableToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Collapsed : Visibility.Visible;
    }
}

বাঁধাই:

Visibility="{Binding PropertyToBind, Converter={StaticResource nullableToVisibilityConverter}}"

2

আপনি কোনও রূপান্তরকারী ব্যবহার করতে পারেন বা আপনার ভিউমোডলে এর মতো নতুন সম্পত্তি তৈরি করতে পারেন:

public bool CanDoIt
{
    get
    {
        return !string.IsNullOrEmpty(SomeField);
    }
}

এবং এটি ব্যবহার করুন:

<DataTrigger Binding="{Binding SomeField}" Value="{Binding CanDoIt}">
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.