سؤال

وأريد الملكية 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top