คุณสมบัติที่ซ่อนอยู่ของ WPF และ XAML?


123

นี่คือคุณสมบัติที่ซ่อนอยู่จำนวนมากซึ่งกล่าวถึงในภาษาต่างๆ ตอนนี้ฉันอยากรู้เกี่ยวกับคุณสมบัติที่ซ่อนอยู่ของ XAML และ WPF หรือไม่?

สิ่งที่ฉันพบคือเหตุการณ์คลิกส่วนหัวของ ListView

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

คุณสมบัติ GridViewColumnHeader.Click ไม่มีอยู่ในรายการ

คุณสมบัติที่เกี่ยวข้องบางอย่างจนถึงตอนนี้:

ดูสิ่งนี้ด้วย:

  1. คุณสมบัติที่ซ่อนอยู่ของ C #
  2. คุณสมบัติที่ซ่อนอยู่ของ Python
  3. คุณสมบัติที่ซ่อนอยู่ของ ASP.NET
  4. คุณสมบัติที่ซ่อนอยู่ของ Perl
  5. คุณสมบัติที่ซ่อนอยู่ของ Java
  6. คุณสมบัติที่ซ่อนอยู่ของ VB.NET
  7. คุณสมบัติที่ซ่อนอยู่ของ PHP
  8. คุณสมบัติที่ซ่อนอยู่ของ Ruby
  9. คุณสมบัติที่ซ่อนอยู่ของ C
  10. และอื่น ๆ ........

7
ดูได้ที่นี่msdn.microsoft.com/en-us/library/… . เหตุการณ์การคลิกสืบทอดมาจาก ButtonBase สิ่งที่คุณกำลังอธิบายคือเหตุการณ์ที่แนบมาซึ่งเป็นแนวคิดที่มีประสิทธิภาพใน WPF ( msdn.microsoft.com/en-us/library/bb613550.aspx ) ด้วยวิธีนี้คุณสามารถทำ <ปุ่มตารางคลิก> ด้วยปุ่ม 100 ปุ่มบนเส้นตารางและตัวจัดการเพียง 1 ตัว
Sorskoot

1
ตอนแรกฉันก็แบบว่า "โอ้นี่เราไปกันอีกครั้ง" แต่แล้วฉันก็ได้เรียนรู้บางอย่างในคำตอบดังนั้นฉันจึงนำมันกลับมาทั้งหมด: o: o
Sam Harwell

1
ควรเป็นวิกิชุมชน
tsilb

2
@tsilb ฉันไม่คิดว่ามันควรจะเป็นวิกิชุมชนลองดูที่ลิงค์นี้meta.stackexchange.com/questions/392/…
Prashant

คำตอบ:


87

Multibinding (รวมกับ StringFormat):

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

1
ยอดเยี่ยม :-) เว้นแต่คุณจะใช้ silverlight 4 หรือเก่ากว่า ใช้นิ้วไขว้สำหรับ v5
Simon_Weaver

5
มันเยี่ยมมาก แต่ฉันไม่อยากจะทำ ถ้าฉันต้องการสร้างสตริงฉันจะจัดว่าเป็นตรรกะและต้องการทดสอบหน่วยผลลัพธ์ บางครั้งสิ่งนี้จะดีกว่าในโมเดลมุมมองเป็นสตริงรูปแบบ ()
Iain Holder

58

นอกจากนี้ยังมีเคล็ดลับ PresentationTraceSources.TraceLevel เพื่อดีบักสิ่งที่เกิดขึ้นกับการผูกในสถานการณ์เฉพาะใด ๆ สิ่งที่คุณต้องทำคืออ้างอิง System.Diagnostics namespace ในชุดประกอบ WindowsBase

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 ในการผูก สิ่งนี้จะตั้งค่าคุณสมบัติที่ถูกผูกไว้เป็น Null หากป้อนค่าและหากคุณสมบัติของคุณเป็น Null ก็จะแสดงค่านี้

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

44

3.5sp1 นำ StringFormat เข้าสู่นิพจน์การผูกเช่น

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

ฉันไม่สามารถบรรยายได้ว่าฉันชอบคุณลักษณะนั้นมากแค่ไหน ฉันเกลียดการมีตัวแปลงมูลค่ามากมายวางอยู่รอบ ๆ
Rob

ใช่เป็นหนึ่งในคุณสมบัติที่ช่วยประหยัดเวลาได้ง่ายที่สุด โดยเฉพาะอย่างยิ่งเมื่อรวมกับ TargetNullValue ปัญหามากมายจะหายไป
Bryan Anderson

6
การใส่เครื่องหมายคำพูดเดียวรอบ ๆ StringFormat ควรลบคำเตือนของคอมไพเลอร์ -Text={Binding Date, StringFormat='{}{0:MM/dd/yyyy}'}"
Ryan Versaw

น่ารู้ฉันเคยชินกับการเพิกเฉยต่อพวกเขา
Bryan Anderson

1
ฉันพยายามจะสื่อว่าสตริงการจัดรูปแบบตามอำเภอใจจะใช้งานได้ ฉันเชื่อว่าเวอร์ชันสากลจะเป็น StringFormat = '{} {0: d}' ในกรณีนี้
Bryan Anderson

29

บางครั้งคุณได้รับสตริงที่ยาวเกินไปที่จะแสดงบนป้ายกำกับ ในกรณีนี้เราสามารถใช้ประโยชน์จากTextTrimmingคุณสมบัติTextBlockเพื่อแสดงจุดไข่ปลา

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

ลิงค์ MSDN


พิจารณาเพิ่มคำแนะนำเครื่องมือในกรณีดังกล่าว: tranxcoder.wordpress.com/2008/10/12/…
ท่อง

27

การเพิ่มเอฟเฟกต์ Aero ให้กับ Window

  <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
เพิ่มรหัส แต่ยังไม่เพิ่มเอฟเฟกต์ Aero ฉันพลาดอะไรไปรึเปล่า?
Elmo

21

Generics ใน XAML พร้อม x: TypeArguments

หากคุณต้องการใช้ ObservableCollection ใน XAML คุณต้องสร้างประเภทที่มาจาก ObservableCollection เนื่องจากคุณไม่สามารถประกาศใน 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

การใช้ตัวสร้างที่ไม่ใช่ค่าเริ่มต้นด้วย x: อาร์กิวเมนต์

ในวัตถุ XAML 2006 ต้องมีตัวสร้างเริ่มต้นสาธารณะเพื่อใช้งาน ใน XAML 2009 คุณสามารถส่งผ่านอาร์กิวเมนต์ตัวสร้างโดยใช้ไวยากรณ์ x: Arguments

<!-- 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.Clickเหตุการณ์ที่กล่าวถึงโดย Ortus)


แหล่งที่มาWinUtil.EnableAeroGlassมีอยู่ที่ไหนสักแห่ง?
Oskar

ใช่ แต่มันเปลี่ยนไปมากตั้งแต่ฉันโพสต์สิ่งนี้ ... ตอนนี้มี 2 คุณสมบัติคือ EnableBlur และ GlassFrameMargins คุณสามารถค้นหารหัสได้ที่นี่: projets.developpez.com/projects/dvp-net/repository/entry/trunk/…
Thomas Levesque

15

คุณสามารถอ้างถึงประเภทที่ซ้อนกันใน XAML โดยใช้เครื่องหมายบวก ( +) ตัวอย่างเช่นถ้าเรามีคลาสนี้:

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

เราสามารถอ้างถึงSomeValueใน XAML โดยใช้ไวยากรณ์ต่อไปนี้:

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

ไวยากรณ์นี้ไม่ได้รับการบันทึกไว้ใน MSDNและไม่ได้รับการสนับสนุนอย่างเป็นทางการ มีคนถามเกี่ยวกับเรื่องนี้ในฟอรัม MSDN และเห็นได้ชัดว่ามันทำลาย WPF Designer ของ VS2010 มีการรายงานใน Microsoft Connect


14

การแบ่งปันขนาดตาราง ( นี่คือตัวอย่างที่ดี) เรื่องสั้นขนาดยาวคุณสามารถมีขนาดคอลัมน์ตารางและแถวร่วมกันแม้ในกริดที่แตกต่างกัน สิ่งนี้จะมีค่าสำหรับทุกคนที่ใช้ DataGrids โดยไม่จำเป็นต้องแก้ไขข้อมูลในสถานที่


11

PriorityBinding . อนุญาตให้คุณใช้การเชื่อมแบบ asyn ในลำดับ "มาก่อนใครก่อน":

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

10

การใช้วิธีการโรงงานแบบคงที่ด้วย x: FactoryMethod

เมื่อคุณมีชนิดที่ไม่มีตัวสร้างสาธารณะ แต่เป็นวิธีการโรงงานแบบคงที่คุณต้องสร้างรหัสประเภทนั้นใน XAML 2006 ด้วย XAML 2009 คุณสามารถใช้แอตทริบิวต์ x: FactoryMethodx: Arguments เพื่อส่งผ่านค่าอาร์กิวเมนต์

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

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

7

คุณสมบัติ "คำอธิบายภาพ" ขั้นสูง

อีกสิ่งหนึ่งที่ไม่ชัดเจนคือเนื้อหาของคุณสมบัติบางอย่างที่เราใช้เพื่อให้มี แต่ข้อความ หากคุณสมบัติขององค์ประกอบ GUI เป็นประเภท Object มีโอกาสมากที่คุณจะสามารถเพิ่มแผงความต้องการของคุณที่มีชุดควบคุมแทนการตั้งค่าข้อความได้

ตัวอย่างนี้คือ MenuItem โดยที่ไฟล์ Headerคุณสมบัติ (ซึ่งโดยปกติจะมีเพียงข้อความ) สามารถมีชุดขององค์ประกอบ gui ที่ห่อหุ้มไว้ในแผงควบคุม (หรือเพียงองค์ประกอบ gui หนึ่งรายการหากคุณต้องการเพียงหนึ่งรายการ)

สังเกตIconคุณสมบัติใน MenuItem ด้วย โดยปกติจะมีองค์ประกอบ Image แต่ก็มีอะไรก็ได้!

<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 Świszczowski

6

ประเภทในตัว

หากคุณต้องการเพิ่มออบเจ็กต์ประเภทง่าย ๆ เช่นสตริงหรือสองครั้งในพจนานุกรมทรัพยากรวันนี้คุณต้องแมป clr-namespaces ที่จำเป็นกับเนมสเปซ XML ใน 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/> 

สิ่งนี้ใช้ไม่ได้หากใช้ WPF เพื่อประมวลผล XAML msdn.microsoft.com/en-us/library/ee792007.aspx
scobi

6

การอ้างอิงวัตถุอย่างง่ายด้วย {x: Reference}

หากคุณต้องการสร้างการอ้างอิงวัตถุในวันนี้คุณต้องทำการเชื่อมฐานข้อมูลและประกาศแหล่งที่มาด้วย ElementName ใน 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:Referenceจะเป็นคุณลักษณะภาษา XAML 2009 แต่ก็มีบางสถานการณ์ที่จะทำงานใน XAML ที่คอมไพล์ได้เช่นกัน อย่างไรก็ตามมันใช้ไม่ได้ทุกที่และอาจทำให้มุมมองนักออกแบบ XAML เสียหาย
Mike Strobel

1
@MikeStrobel: มันใช้งานได้ทุกที่และฉันไม่สนใจน้อยกว่าที่นักออกแบบจะทำลาย
HB

6

การใช้สีของระบบ

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

3
การระบุเป็น DynamicResource มีความสำคัญเนื่องจากผู้ใช้สามารถเปลี่ยนสีของระบบในขณะที่แอปพลิเคชันของคุณกำลังทำงานอยู่
M. Dudley

3

รองรับคีย์พจนานุกรมตามอำเภอใจ

ใน XAML 2006 Explicit 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

ตั้งค่า ValidationError ตามรหัส

ValidatioRule ใน BindingExpression จะทริกเกอร์เท่านั้นเมื่อด้านเป้าหมายของการโยงเปลี่ยนไป หากคุณต้องการตั้งค่าข้อผิดพลาดในการตรวจสอบด้วยรหัสคุณสามารถใช้ข้อมูลโค้ดต่อไปนี้

ตั้งค่าข้อผิดพลาดในการตรวจสอบความถูกต้อง

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 ลงใน TextBlock

ฉันไม่รู้ว่ามีประโยชน์แค่ไหน (มีคุณสมบัติเหมือนซ่อนอยู่) นี่คือ ... แต่แน่นอนว่าทำให้ฉันไม่ระวังเมื่อฉันเจอมันครั้งแรก :

<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

ตามที่กล่าวไว้ที่นี่คุณสามารถผูกคุณสมบัติวัตถุ CLR ธรรมดาโดยไม่ต้อง INotifyPropertyChanged และมันจะใช้งานได้ได้

นี่คือForumpostฉันอ้างถึง

อ้างถึง:

[... ] เอ็นจิ้นการผูกข้อมูลของ WPF จะเชื่อมโยงข้อมูลกับอินสแตนซ์ PropertyDescriptor ซึ่งปิดคุณสมบัติต้นทางหากอ็อบเจ็กต์ต้นทางเป็นอ็อบเจ็กต์ CLR ธรรมดาและไม่ได้ใช้อินเทอร์เฟซ INotifyPropertyChanged และเอ็นจินการผูกข้อมูลจะพยายามสมัครสมาชิกกับเหตุการณ์ที่เปลี่ยนแปลงคุณสมบัติผ่านเมธอด PropertyDescriptor.AddValueChanged () และเมื่อองค์ประกอบที่ผูกข้อมูลเป้าหมายเปลี่ยนค่าคุณสมบัติเอ็นจินการผูกข้อมูลจะเรียกใช้เมธอด PropertyDescriptor.SetValue () เพื่อถ่ายโอนค่าที่เปลี่ยนแปลงกลับไปยังคุณสมบัติต้นทางและจะเพิ่มเหตุการณ์ ValueChanged พร้อมกันเพื่อแจ้งให้สมาชิกรายอื่น (ในกรณีนี้ สมาชิกรายอื่นจะเป็น TextBlocks ภายใน ListBox

และหากคุณกำลังใช้ INotifyPropertyChanged คุณมีหน้าที่รับผิดชอบอย่างเต็มที่ในการใช้การแจ้งเตือนการเปลี่ยนแปลงในทุกตัวตั้งค่าของคุณสมบัติที่ต้องเชื่อมโยงข้อมูลกับ UI มิฉะนั้นการเปลี่ยนแปลงจะไม่ซิงโครไนซ์ตามที่คุณคาดไว้ [... ]

นี่เป็นอีกหนึ่งบทความที่ยอดเยี่ยมและมีรายละเอียดเกี่ยวกับเรื่องนี้

หมายเหตุ: งานนี้เฉพาะเมื่อใช้ที่มีผลผูกพัน ถ้าคุณปรับปรุงค่าจากรหัสการเปลี่ยนแปลงจะไม่ได้รับการแจ้งเตือน [ ... ]

การนำ INotifyPropertyChanged ไปใช้อาจเป็นงานพัฒนาที่ค่อนข้างน่าเบื่อ อย่างไรก็ตามคุณจะต้องชั่งน้ำหนักที่ทำงานเทียบกับ runtime footprint (หน่วยความจำและ CPU) ของแอปพลิเคชัน WPF ของคุณ การใช้ INPC ตัวเองจะประหยัด CPU รันไทม์และหน่วยความจำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.