WPF और XAML की छिपी विशेषताएं?


123

यहाँ विभिन्न भाषाओं के लिए बड़ी संख्या में छिपी हुई विशेषताओं पर चर्चा की गई है। अब मैं XAML और WPF की कुछ छिपी विशेषताओं के बारे में उत्सुक हूं?

एक मैंने पाया है कि एक सूची दृश्य का हेडर क्लिक इवेंट है

<ListView x:Name='lv' 
      Height="150" 
      GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">

GridViewColumnHeader.Click संपत्ति सूचीबद्ध नहीं है।

अब तक की कुछ प्रासंगिक विशेषताएं:

यह सभी देखें:

  1. C # की छिपी विशेषताएं
  2. पायथन की छिपी विशेषताएं
  3. ASP.NET की छिपी विशेषताएं
  4. पर्ल की छिपी विशेषताएं
  5. जावा की छिपी विशेषताएं
  6. VB.NET की छिपी विशेषताएं
  7. PHP की छिपी विशेषताएं
  8. रूबी की छिपी विशेषताएं
  9. सी की छिपी विशेषताएं
  10. और इसी तरह........

7
यहाँ एक नज़र रखें msdn.microsoft.com/en-us/library/… । बटन इवेंट बटनबेस से विरासत में मिला है। आप जो वर्णन कर रहे हैं वह जुड़ी हुई घटनाएँ हैं, WPF में एक बहुत शक्तिशाली अवधारणा ( msdn.microsoft.com/en-us/library/bb613550.aspx )। इस तरह से आप ग्रिड पर 100 बटन और केवल 1 हैंडलर के साथ <ग्रिड Button.Click> कर सकते हैं।
सोर्कूट

1
सबसे पहले मैं "ओह, यहाँ हम फिर से चलते हैं" की तरह थे, लेकिन फिर मैंने प्रतिक्रियाओं में कुछ सीखा, इसलिए मैं इसे वापस लेता हूं: ओ: ओ
सैम हरवेल

1
सामुदायिक विकि होना चाहिए
tsilb

2
@tsilb मुझे नहीं लगता कि यह सामुदायिक विकी होना चाहिए, इस लिंक को देखो meta.stackexchange.com/questions/392/…
प्रशांत चोलाचगड्डा

जवाबों:


87

मल्टीबाइंडिंग ( StringFormat के साथ संयुक्त):

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="{}{0}, {1}">
      <Binding Path="LastName" />
      <Binding Path="FirstName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

1
भयानक :-) जब तक आप 4 या उससे पहले की चांदी का उपयोग नहीं कर रहे हैं। उंगलियां v5 के लिए पार हो
गईं

5
यह बहुत अच्छा है, लेकिन मुझे ऐसा करने के लिए लुभाया नहीं जाएगा। यदि मुझे एक स्ट्रिंग बनाने की आवश्यकता है, तो मैं उस वर्ग को तर्क के रूप में बताऊंगा और आउटपुट का परीक्षण करना चाहता हूं। इस तरह से सामान कभी-कभी एक स्ट्रिंग के रूप में दृश्य मॉडल में बेहतर होता है। फ़र्मैट ()।
आईन होल्डर

58

PresentationTraceSources.raceLevel ट्रिक भी है जो किसी विशेष परिदृश्य में बाइंडिंग के साथ चल रहा है। आपको बस इतना करना है कि WindowsBase असेंबली में System.Diagnostics नाम स्थान का संदर्भ लें

xmlns:sd="clr-namespace:System.Diagnostics;assembly=WindowsBase"

और फिर बंधन अभिव्यक्ति के लिए निम्नलिखित जोड़ें:

<TextBlock Text="{Binding Message, sd:PresentationTraceSources.TraceLevel=High}"  />

लॉग इस तरह होगा:

System.Windows.Data Warning: 52 : Created BindingExpression (hash=5923895) for Binding (hash=7588182)
System.Windows.Data Warning: 54 :   Path: 'Message'
System.Windows.Data Warning: 56 : BindingExpression (hash=5923895): Default mode resolved to OneWay
System.Windows.Data Warning: 57 : BindingExpression (hash=5923895): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 58 : BindingExpression (hash=5923895): Attach to System.Windows.Controls.TextBlock.Text (hash=65248697)
System.Windows.Data Warning: 63 : BindingExpression (hash=5923895): Resolving source 

4
VisualStudio 2010 में आपको ट्रेस सेटिंग के स्तर को चेतावनी पर सेट करने की आवश्यकता है! देखें stackoverflow.com/questions/2802662/…
WaltiD

44

3.5sp1 ने बाइंडिंग को TargetNullValue पेश किया। यदि मान दर्ज किया गया है तो यह अशक्त संपत्ति को नल को सेट कर देगा और यदि आपकी संपत्ति शून्य है तो यह मान प्रदर्शित करेगा।

<TextBox Text="{Binding Total, TargetNullValue=$0.00}" />

44

3.5sp1 ने StringFormat को बाध्यकारी भावों में पेश किया, उदा

<TextBox Text="{Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}" />

मैं शब्दों में नहीं बता सकता कि मैं उस सुविधा से कितना प्यार करता हूँ। मैं चारों ओर ले जाने के मूल्य कन्वर्टर्स के टन से नफरत है।
रोब

हाँ, आसानी से सबसे अधिक समय बचाने वाली सुविधाओं में से एक जोड़ा गया। खासकर जब TargetNullValue के साथ संयुक्त समस्याओं का एक बहुत दूर चले जाते हैं।
ब्रायन एंडरसन

6
StringFormat के आसपास एकल उद्धरण डालकर कुछ संकलक चेतावनियों को हटा देना चाहिए -Text={Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}"
रयान वर्सा

पता करने के लिए अच्छा है, मैं सिर्फ उन्हें अनदेखा करने के लिए इस्तेमाल किया है।
ब्रायन एंडरसन

1
मैं यह बताने की कोशिश कर रहा था कि कोई भी मनमाना फॉर्मेटिंग स्ट्रिंग काम करेगा। मेरा मानना ​​है कि इस मामले में अंतरराष्ट्रीय संस्करण स्ट्रिंगरफॉर्म = '{} {0: d}' होगा।
ब्रायन एंडरसन

29

कभी-कभी आपको स्ट्रिंग मिलती है जो लेबल पर दिखाने के लिए बहुत लंबी है। इस मामले में हम एलिप्स को दिखाने TextTrimmingके TextBlockलिए संपत्ति का उपयोग कर सकते हैं

<TextBlock 
  Name="sampleTextBlock" 
  TextTrimming="WordEllipsis" 
  TextWrapping="NoWrap"/>

MSDN लिंक


ऐसे मामले में टूलटिप जोड़ने पर विचार करें: tranxcoder.wordpress.com/2008/10/12/…
सर्फ करें

27

विंडो में एयरो प्रभाव जोड़ना

  <Window.Resources>
    <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
        PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
</Window.Resources>

1
कोड जोड़ा गया है, लेकिन फिर भी एयरो प्रभाव नहीं जोड़ता है। क्या मैं कुछ भूल रहा हूँ?
एल्मो

21

X के साथ XAML में जेनरिक: टाइपअर्जमेंट

यदि आप XAML में ऑब्जर्वेबल कॉलेलेशन का उपयोग करना चाहते हैं, तो आपको एक प्रकार बनाने की आवश्यकता है जो ऑब्जर्वेबल कॉलेक्शन से निकलता है क्योंकि आप इसे एक्सएएमएल में घोषित नहीं कर सकते हैं। XAML 2009 के साथ आप जेनेरिक प्रकार के प्रकार को परिभाषित करने के लिए x: TypeArguments विशेषता का उपयोग कर सकते हैं।

<!-- XAML 2006 -->
class EmployeeCollection : ObservableCollection<Employee>
{
}

<l:EmployeeCollection>
    <l:Employee FirstName="John" Name="Doe" />
    <l:Employee FirstName="Tim" Name="Smith" />
</lEmployeeCollection>

<!-- XAML 2009 -->
<ObservableCollection x:TypeArguments="Employee">
    <l:Employee FirstName="John" Name="Doe" />
    <l:Employee FirstName="Tim" Name="Smith" />
</ObservableCollection />

1
दुर्भाग्य से, x: TypeArguments केवल ढीली xaml फ़ाइलों में उपलब्ध है और उन्हें संकलित नहीं किया गया है :(
kevindaub

हां, ढीले xaml केवल :( WPF डेवलपर्स XAML2009 के बहुमत के लिए बेकार है।
Grigory

19

अक्षम नियंत्रण पर टूलटिप दिखाएं

Wpf टूलटिप को एक नियंत्रण पर दिखाने की अनुमति देता है, अगर यह अक्षम अवस्था में है।

उदाहरण के लिए

<Button Content="Disabled Button" ToolTipService.ShowOnDisabled="True" IsEnabled="False" ToolTip="This is a disabled button"/> 

19

एक्स के साथ गैर-डिफ़ॉल्ट कंस्ट्रक्टर्स का उपयोग: तर्क

XAML 2006 में वस्तुओं का उपयोग करने के लिए सार्वजनिक डिफ़ॉल्ट निर्माता होना चाहिए। XAML 2009 में आप एक्स: आर्ग्युमेंट्स सिंटैक्स का उपयोग करके कंस्ट्रक्टर के तर्क पास कर सकते हैं।

<!-- XAML 2006 -->
<DateTime>00:00:00.0000100</DateTime>

<!-- XAML 2009 -->
<DateTime>
    <x:Arguments>
        <x:Int64>100</x:Int64>
    </x:Arguments>
</DateTime>


18

मार्कअप एक्सटेंशन और संलग्न गुण मेरी पसंदीदा विशेषताएं हैं, वे आपको बहुत ही सुरुचिपूर्ण तरीके से XAML "शब्दावली" का विस्तार करने में सक्षम बनाते हैं।

मार्कअप एक्सटेंशन

<!-- Binding to app settings -->
<CheckBox IsChecked="{my:SettingBinding MinimizeToTray}">Close to tray</CheckBox>

<!-- Fill ItemsControl with the values of an enum -->
<ComboBox ItemsSource="{my:EnumValues sys:DaysOfWeek}"/>

<!-- Localization -->
<TextBlock Text="{my:Localize HelloWorld.Text}"/>

<!-- Switch on the result of a binding -->
<TextBlock Text="{my:Switch Path=IsGood, ValueIfTrue=Good, ValueIfFalse=Bad}"/>

संलग्न गुण

<!-- Sort GridView automatically -->
<ListView ItemsSource="{Binding Persons}"
      IsSynchronizedWithCurrentItem="True"
      util:GridViewSort.AutoSort="True">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name"
                                DisplayMemberBinding="{Binding Name}"
                                util:GridViewSort.PropertyName="Name"/>
                <GridViewColumn Header="First name"
                                DisplayMemberBinding="{Binding FirstName}"
                                util:GridViewSort.PropertyName="FirstName"/>
                <GridViewColumn Header="Date of birth"
                                DisplayMemberBinding="{Binding DateOfBirth}"
                                util:GridViewSort.PropertyName="DateOfBirth"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>


<!-- Vista Glass effect -->
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="Window1"
        my:WinUtil.EnableAeroGlass="True">

...

GridViewSort के लिए स्रोत (btw, यह GridViewColumnHeader.ClickOrtus द्वारा उल्लिखित घटना का उपयोग करता है )


क्या स्रोत WinUtil.EnableAeroGlassकहीं उपलब्ध है?
ओस्कर

हां, लेकिन मैंने इसे पोस्ट करने के बाद इसे बहुत बदल दिया है ... अब 2 गुण हैं, EnableBlur और GlassFrameMargins। आप यहां कोड पा सकते हैं: projets.developpez.com/projects/dvp-net/repository/entry/trunk/…
थॉमस लेवेस्क

15

आप प्लस चिह्न ( +) का उपयोग करके XAML में नेस्टेड प्रकारों को संदर्भित कर सकते हैं । उदाहरण के लिए, यदि हमारे पास यह वर्ग था:

public class SomeClass
{
    public enum SomeEnum
    {
        SomeValue
    };
}

हम SomeValueनिम्नलिखित वाक्यविन्यास का उपयोग कर XAML में उल्लेख कर सकते हैं :

{x:Static local:SomeClass+SomeEnum.SomeValue}

यह सिंटैक्स MSDN पर प्रलेखित नहीं है , और यह आधिकारिक रूप से समर्थित नहीं है। MSDN मंचों पर किसी ने इसके बारे में पूछा , और जाहिर तौर पर यह VS2010 के WPF डिज़ाइनर को तोड़ता है। यह Microsoft कनेक्ट पर बताया गया है।


14

ग्रिड आकार साझाकरण ( यहां एक अच्छा उदाहरण है)। छोटी कहानी छोटी ग्रिड ग्रिड और पंक्तियाँ साझा आकार, यहां तक ​​कि विभिन्न ग्रिडों में भी हो सकती हैं। यह उन सभी लोगों के लिए अमूल्य होगा, जो डेटाग्रेड का उपयोग कर रहे हैं, बिना जगह में डेटा को संपादित करने की आवश्यकता के बिना।


11

प्राथमिकता बाँधना । आपको "पहले आओ पहले पाओ" क्रम में एसिन बाइंडिंग का उपयोग करने की अनुमति देता है:

<TextBlock.Text>
      <PriorityBinding FallbackValue="defaultvalue">
        <Binding Path="SlowestDP" IsAsync="True"/>
        <Binding Path="SlowerDP" IsAsync="True"/>
        <Binding Path="FastDP" />
      </PriorityBinding>
</TextBlock.Text>

10

एक्स के साथ स्टेटिक फैक्ट्री विधियों का उपयोग: फैक्ट्रीमेथोड

जब आपके पास एक प्रकार है जिसमें कोई सार्वजनिक निर्माता नहीं है, लेकिन एक स्थिर कारखाना विधि है जिसे आपको XAML 2006 में कोड में बनाना होगा। XAML 2009 के साथ आप x का उपयोग कर सकते हैं: FactoryMethodx: तर्क मानों को पास करने के लिए तर्क विशेषता।

<!-- XAML 2006 -->
Guid id = Guid.NewGuid();

<!-- XAML 2009 -->
<Guid x:FactoryMethod="Guid.NewGuid" />

7

उन्नत "कैप्शन" गुण

एक और बात जो बहुत स्पष्ट नहीं है वह कुछ गुणों की सामग्री है, जिनका उपयोग हम केवल पाठ में करते हैं। यदि GUI तत्व की संपत्ति ऑब्जेक्ट की है, तो यह बहुत संभव है कि आप केवल टेक्स्ट सेट करने के बजाय, अपनी आवश्यकता का एक पैनल जोड़ सकते हैं जिसमें नियंत्रण का एक सेट शामिल है।

इसका एक उदाहरण MenuItem है, जहां Headerसंपत्ति (जिसमें आम तौर पर सिर्फ पाठ होता है) में एक पैनल नियंत्रण में लिपटे हुए गुई तत्वों का एक सेट (या सिर्फ एक गुई तत्व हो सकता है यदि आपको सिर्फ एक की आवश्यकता है)।

IconMenuItem पर संपत्ति पर भी ध्यान दें । इसमें सामान्य रूप से एक छवि तत्व होता है, लेकिन इसमें कुछ भी हो सकता है!

<MenuItem Name="MyMenuItem" Click="MyMenuItem_Click">
  <MenuItem.Icon>
    <Button Click="Button1_Click">i</Button>
  </MenuItem.Icon>
  <MenuItem.Header>
     <StackPanel Orientation="Horizontal" >
        <Label>My text</Label>
        <Button Click="Button2_Click">ClickMe!</Button>
     </StackPanel>
  </MenuItem.Header>
</MenuItem>

7

यह भी बहुत उपयोगी है: GridLengthConverter, BooleanToVisibilityConverter, AlternationConverter सभी System.Windows.Controls
Maciek iswiszczowski

6

अंतर्निहित प्रकार

यदि आप स्ट्रिंग जैसे सरल प्रकारों की वस्तुओं को जोड़ना चाहते हैं या आज एक संसाधन शब्दकोश से दोगुना चाहते हैं, तो आपको एक XML नाम स्थान के लिए आवश्यक clr-namespaces को मैप करना होगा। XAML 2009 में हम बहुत से सरल प्रकार हैं जो XAML भाषा में शामिल हैं।

<!-- XAML 2006 -->
<sys:String xmlns:sys="clr-namespace:System;assembly=mscorlib >Test</sys:String>

<!-- XAML 2009 -->
<x:String>Test</x:String>

निम्नलिखित प्रकार XAML भाषा में शामिल हैं:

<x:Object/> 
<x:Boolean/> 
<x:Char/> 
<x:String/> 
<x:Decimal/> 
<x:Single/> 
<x:Double/> 
<x:Int16/> 
<x:Int32/> 
<x:Int64/> 
<x:TimeSpan/> 
<x:Uri/> 
<x:Byte/> 
<x:Array/> 
<x:List/> 
<x:Dictionary/> 

XAML को संसाधित करने के लिए WPF का उपयोग करने पर यह काम नहीं करता है। msdn.microsoft.com/en-us/library/ee792007.aspx
scobi

6

{X: संदर्भ} के साथ आसान वस्तु संदर्भ

यदि आप एक ऑब्जेक्ट संदर्भ बनाना चाहते हैं, तो आज आपको डेटाबाइंडिंग करने और एलीमेंटनाम के साथ स्रोत घोषित करने की आवश्यकता है। XAML 2009 में आप नए {x: Reference} मार्कअप एक्सटेंशन का उपयोग कर सकते हैं

<!-- XAML 2006 -->
<Label Target="{Binding ElementName=firstName}">FirstName</Label>
<TextBox x:Name="firstName" />

<!-- XAML 2009 -->
<Label Target="{x:Reference firstName}">FirstName</Label>
<TextBox x:Name="firstName" />

यह ध्यान देने योग्य है कि x:ReferenceXAML 2009 भाषा की विशेषता है, वहीं कुछ परिदृश्य भी हैं जहां यह संकलित XAML में भी काम करेगा। हालाँकि, यह हर जगह काम नहीं करता है, और यह XAML डिज़ाइनर दृश्य को तोड़ सकता है।
माइक स्ट्रोबेल

1
@ माइक स्ट्रोबेल: यह हर जगह बहुत काम करता है, और मैं डिजाइनरों को तोड़ने के बारे में कम परवाह नहीं कर सकता।
एचबी

6

सिस्टम रंग उपयोग

<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>

3
इसे एक डायनामिक स्रोत के रूप में निर्दिष्ट करना महत्वपूर्ण है क्योंकि उपयोगकर्ता आपके सिस्टम के चलने के दौरान सिस्टम के रंगों को बदल सकता है।
एम। डुडले

3

मनमानी शब्दकोश कुंजी के लिए समर्थन

XAML 2006 में सभी स्पष्ट x: कुंजी मान को स्ट्रिंग्स के रूप में माना गया था। XAML 2009 में आप ElementSyntax में कुंजी लिखकर अपनी पसंद की किसी भी प्रकार को परिभाषित कर सकते हैं।

<!-- XAML 2006 -->
<StreamGeometry x:Key="CheckGeometry">M 0 0 L 12 8 l 9 12 z</StreamGeometry>

<!-- XAML 2009 -->
<StreamGeometry>M 0 0 L 12 8 l 9 12 z
    <x:Key><x:Double>10.0</x:Double></x:Key>
</StreamGeometry>

2

कोड द्वारा एक वैधता सेट करें

बाइंडिंग एक्सप्रेशन में एक ValidatioRule केवल ट्रिगर करता है, जब बाइंडिंग का लक्ष्य पक्ष बदलता है। यदि आप कोड द्वारा एक सत्यापन त्रुटि सेट करना चाहते हैं तो आप निम्नलिखित स्निपेट का उपयोग कर सकते हैं।

सत्यापन त्रुटि सेट करें

ValidationError validationError = 
    new ValidationError(regexValidationRule, 
    textBox.GetBindingExpression(TextBox.TextProperty));

validationError.ErrorContent = "This is not a valid e-mail address";

Validation.MarkInvalid(
    textBox.GetBindingExpression(TextBox.TextProperty), 
    validationError);

सत्यापन त्रुटि साफ़ करें

Validation.ClearInvalid(textBox.GetBindingExpression(TextBox.TextProperty));

2

एक पाठ्यपुस्तक में स्टफ UIElement (ओं) की क्षमता

मुझे नहीं पता कि यह कितना उपयोगी है (हालांकि यह छिपे हुए के रूप में योग्य है) यह है ... लेकिन यह सुनिश्चित हो गया कि जब मैंने पहली बार इसमें भाग लिया था, तो मुझे ऑफ-गार्ड पकड़ा था :

<Grid x:Name="LayoutRoot">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid>
            <Rectangle Fill="AliceBlue" Width="25" Height="25"/>
        </Grid>
    </TextBlock>
</Grid>

आप तर्क दे सकते हैं कि निम्नलिखित xaml उपयोगी हो सकता है (यानी कुछ पाठ के अंत में एक ग्राफिक डालकर):

<Grid>
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Hello World">
        <TextBlock.Resources>
            <DrawingBrush x:Key="exclamationPoint" Stretch="Uniform">
                <DrawingBrush.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Brush="#FF375CE2" Geometry="F1 M 7.968,58.164L 0,58.164L 1.914,49.921L 9.882,49.921L 7.968,58.164 Z M 21.796,0L 11.054,42.148L 4.403,42.148L 13.049,0L 21.796,0 Z "/>
                        </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </TextBlock.Resources>
        <Grid>
            <Rectangle Width="100" Height="100" Fill="{StaticResource exclamationPoint}"/>
        </Grid>
    </TextBlock>
</Grid>

उपरोक्त xaml निम्न की तरह प्रस्तुत करता है:

नमस्ते दुनिया


1

एनिमेशन डिबगिंग

आम त्रुटियों

यदि आपको निम्न त्रुटि मिलती है: अपरिवर्तनीय वस्तु उदाहरण पर '(0)। (1)' को चेतन नहीं कर सकता। यह हो सकता है कि आपको निम्नलिखित सीमाओं में से एक में चलाया जाए:

  • आप स्थानीय मूल्य निर्धारित किए बिना एक निर्भरता संपत्ति को एनिमेट कर रहे हैं
  • आप एक निर्भरता संपत्ति को एनिमेट कर रहे हैं, जिसका वर्तमान मान किसी अन्य असेंबली में परिभाषित है जिसे संसाधन शब्दकोश में विलय नहीं किया गया है।
  • आप वर्तमान में डेटबाउंड के मान को एनिमेट कर रहे हैं

1

InotifyPropertyChanged या DependencyProperties के बिना बंधन

जैसा कि यहां चर्चा की गई है कि आप INOTifyPropertyChanged के बिना एक सादे CLR ऑब्जेक्ट प्रॉपर्टी को बांध सकते हैं, और यह सिर्फ काम करेगा ।

यहाँ मैं Forumpost का उल्लेख कर रहा हूँ।

उद्धरण:

[...] WPF का डेटा बाइंडिंग इंजन PropertyDescriptor उदाहरण के लिए डेटा बाइंड करेगा जो स्रोत संपत्ति को लपेटता है यदि स्रोत ऑब्जेक्ट एक सीएलआर ऑब्जेक्ट है और INotifyPropertyChanged इंटरफ़ेस को लागू नहीं करता है। और डेटा बाइंडिंग इंजन PropertyDescriptor.AddValueChanged () विधि के माध्यम से संपत्ति परिवर्तित घटना की सदस्यता लेने की कोशिश करेगा। और जब टारगेट डेटा बाउंड एलिमेंट प्रॉपर्टी वैल्यू को बदल देता है, तो डेटा बाइंडिंग इंजन PropertyDescriptor.SetValue () मेथड को बदले हुए वैल्यू को सोर्स प्रॉपर्टी में ट्रांसफर करने की विधि कहेगा, और यह अन्य सब्सक्राइबर्स को सूचित करने के लिए एक साथ ValueChanged ईवेंट बढ़ाएगा (इस उदाहरण में, अन्य ग्राहकों की सूची बॉक्स के भीतर TextBlocks होगी।

और यदि आप INotifyPropertyChanged को कार्यान्वित कर रहे हैं, तो आप संपत्तियों के हर सेटर में परिवर्तन अधिसूचना को लागू करने के लिए पूरी तरह से जिम्मेदार हैं, जिन्हें UI के लिए डेटा बाध्य होना चाहिए। अन्यथा, जैसा कि आप अपेक्षा करेंगे, परिवर्तन सिंक्रनाइज़ नहीं किया जाएगा। [...]

यहाँ इस विषय पर एक और महान और विस्तृत लेख है

ध्यान दें कि यह केवल बंधन का उपयोग करते समय काम करता है । यदि आप कोड से मानों को अपडेट करते हैं , तो परिवर्तन को अधिसूचित नहीं किया जाएगा । [...]

INotifyPropertyChanged को लागू करना थकाऊ विकास कार्यों का एक उचित हिस्सा हो सकता है। हालाँकि, आपको अपने WPF एप्लिकेशन के रनटाइम फ़ुटप्रिंट (मेमोरी और CPU) के विरुद्ध उस कार्य को तौलना होगा। स्वयं INPC को लागू करने से रनटाइम CPU और मेमोरी की बचत होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.