ملزمة WPF تحرير وسرد لا يعمل كما هو متوقع
-
04-07-2019 - |
سؤال
وأريد الملكية ItemsSource بلدي WPF تحرير وسرد لتكون ملزمة للممتلكات قائمتي MyListObject ل. المشكلة هي أنني عندما تحديث الخاصية قائمتي في التعليمات البرمجية، وWPF تحرير وسرد لا تعكس التحديث. أنا رفع الحدث PropertyChanged بعد أن إجراء التحديث، واعتقدت WPF كان من المفترض أن تستجيب تلقائيا عن طريق تحديث واجهة المستخدم. هل فاتني شيء؟
إليك الكائن CLR:
Imports System.ComponentModel
Public Class MyListObject
Implements INotifyPropertyChanged
Private _mylist As New List(Of String)
Public Sub New()
_mylist.Add("Joe")
_mylist.Add("Steve")
End Sub
Public Property MyList() As List(Of String)
Get
Return _mylist
End Get
Set(ByVal value As List(Of String))
_mylist = value
End Set
End Property
Public Sub AddName(ByVal name As String)
_mylist.Add(name)
NotifyPropertyChanged("MyList")
End Sub
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Public Event PropertyChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.PropertyChangedEventArgs) _
Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class
وهنا هو XAML:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
xmlns:local="clr-namespace:WpfApplication1"
>
<Window.Resources>
<ObjectDataProvider x:Key="MyListObject" ObjectType="{x:Type local:MyListObject}"/>
</Window.Resources>
<Grid>
<ComboBox Height="23"
Margin="24,91,53,0"
Name="ComboBox1"
VerticalAlignment="Top"
ItemsSource="{Binding Path=MyList, Source={StaticResource MyListObject}}"
/>
<TextBox Height="23"
Margin="24,43,134,0"
Name="TextBox1"
VerticalAlignment="Top" />
<Button Height="23"
HorizontalAlignment="Right"
Margin="0,43,53,0"
Name="btn_AddName"
VerticalAlignment="Top"
Width="75">Add</Button>
</Grid>
</Window>
وهنا هو رمز وراء بسيط:
Class Window1
Private obj As New MyListObject
Private Sub btn_AddName_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _
Handles btn_AddName.Click
obj.AddName(TextBox1.Text)
End Sub
End Class
وشكرا!
المحلول
وأنت ملزم لقائمة السلاسل. تلك الفئة القائمة لا تنفذ Inotifyproperty. يجب استخدام observablecollection بدلا من ذلك. كما أنني لاحظت في التعليمات البرمجية وراء قمت بتعريف
Private obj As New MyListObject
وهذا ليس هو مورد ثابت كنت ملزمة مربع التحرير والسرد ل. لذلك لن ينعكس دعوة إضافة الخاصة بك في وجهة نظركم.
نصائح أخرى
ووObservableCollection هو الأرجح الحل، ولكن إذا كان لا يزال يعطي لك الحزن، يمكنك الوصول مباشرة إلى الموارد ثابت عن طريق استدعاء التعليمات البرمجية التالية بعد يتم تحديثها قائمتك:
DirectCast(Me.FindResource("MyListObject"), ObjectDataProvider).Source = _myList
وحاول استخدام BindingList (وT) بدلا من ذلك ل قائمة (وT).
وتحرير: أنا جديدة لبرنامج الأغذية العالمي وأنها لا تبدو مثل BindingList ليس حلا كاملا للمشكلة، ولكن قد يكون خطوة في الاتجاه الصحيح. وكنت قادرا على اختبار MyListObject تحويلها إلى BindingList في WinForm وتم رفع الحدث ListChanged لتحرير وسرد الذي ثم تحديث قائمتها.
ولقد وجدت هذا (ممكن) الحل التفاف صفك في ObservableCollection التي قد تساعدك في حل مشكلتك
<وأ href = "http://blogs.sqlxml.org/bryantlikes/archive/2006/09/20/Enabling-WPF-Magic-Using-WCF-_2D00_-Part-1.aspx" يختلط = "نوفولو noreferrer "> تمكين WPF السحر عن طريق WCF - الجزء 1
وهذا هو رمز لتحديث وجوه الخاص بك إلى BindingList. الجمع بين الشفرة مع رمز من هذا المورد، ويجب أن تكون على ما يرام.
Public Class MyListObject
...
'Private _mylist As New List(Of String)
Private _mylist As New BindingList(Of String)
...
'Public Property MyList() As List(Of String)
' Get
' Return _mylist
' End Get
' Set(ByVal value As List(Of String))
' _mylist = value
' End Set
'End Property
Public Property MyList() As BindingList(Of String)
Get
Return _mylist
End Get
Set(ByVal value As BindingList(Of String))
_mylist = value
End Set
End Property
...
End Class