سؤال

في البداية أريد أن أقول أن النموذج أدناه هو التبسيط.افترض أن لديك لا بد WPF التحكم.

<Window Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel>
        <TextBox Text="{Binding Name}" Margin="10"/>
        <Button HorizontalAlignment="Center" 
        Content="Click Me" Margin="5" 
        Padding="2" Click="OnButtonClick" />
    </StackPanel>
</Grid>
</Window>

نافذة لا بد أن الشخص الدرجة التي تنفذ INotifyPropertyChanged ولها اسم واضع في شكل

    public string Name 
    {
        get { return _name; }
        set 
        {
            _name = "Some Name";
            OnPropertyChanged("Name");
        }
    }

أولا-هاء._name يتم تعيين "بعض اسم" كلما يحاول المستخدم تغيير من واجهة المستخدم.ولكن هذا النموذج لا يعمل.لقد غيرت اسم في مربع نص إلى بعض القيمة اضغط على tab مما اضطر التركيز للانتقال إلى زر القيمة في مربع النص لم يتغير على الرغم من PropertyChanged حال تم تشغيلها.

هل يمكنك أن تشرح لي لماذا يحدث ذلك ؟ كما أفهم PropertyChanged الحدث القوات واجهة المستخدم إلى إعادة قراءة القيم من خصائص وعرضها ولكن في بلدي على سبيل المثال قيمة في databound النص لا يتم تحديث.


مرة أخرى.أنا أفهم أن هذا هو سوء تنفيذ الممتلكات و لكن أريد أن أكرر أن هذا هو التبسيط.هذا هو مجرد عينة.ولكن على أي حال ، PropertyChanged إشارات أن العقار تم تغيير يجب أن يتم تحديث ولكن لا.

هل كانت مفيدة؟

المحلول

على PropertyChanged الحدث هو تجاهل النص لأنه هو البادئ الحدث.

بعض التوضيحات:

مربع النص (أو ملزمة مربع نص) يعرف أنه هو البادئ لأنه يتلقى PropertyChanged الحدث في نفس المكالمة.عن طريق القيام استدعاء غير متزامن, مربع النص (أو ملزمة) لا يوجد لديه وسيلة لمعرفة أن كان هو البادئ ، لذلك سوف عملية الحدث كما لو كان شخصا آخر تحديث

إذا قمت بإضافة عدد 2 مربع نص إلى واجهة المستخدم الخاصة بك, سترى أن 2 مربع نص لا يتغير عند تحرير 1st, و العكس.

نصائح أخرى

دمية محول الحل الذي اقترحه Heinzi (موضح هنا) لا يعمل عند ربط هذا UpdateSourceTrigger هو PropertyChanged.ولكن ماذا إذا كان هذا هو ما نحتاج ؟

يبدو أن القرارات الملزمة asynchrounous لا حيلة, على سبيل المثال:

SelectedIndex="{Binding SelectedIndex, IsAsync=True}"

كما Bubblewrap أشار بالفعل هذا هو حسب التصميم -- مربع النص يفترض أنه إذا لم يحدد لا بد الملكية إلى بعض القيمة ، واضع لن تتغير قيمة. ووفقا لمايكروسوفت, أنهم لن يغير هذا السلوك لأن هذا من شأنه كسر رمز القائمة.

إذا كنت تريد لتغيير القيمة (نعم ، هناك تماما أسباب وجيهة للقيام بذلك) ، يجب استخدام الحل البديل ، على سبيل المثال ، عن طريق إضافة دمية محول.هناك بلوق دخول (لم يكتب لي) واصفا هذه التقنية بالتفصيل.

والسبب هو لأن لديك ضمنية على بعض اسم' في واضع.عند تغيير مربع النص قيمة اضع هو في الواقع الحصول على اتصل مرة أخرى وضع "بعض اسم" كما propertyValue لذلك لا يبدو أن تغيير في واجهة المستخدم.وضع _name = value والأمور سوف تعمل فقط كما هو متوقع ،

public string MyField  
{  
    get { return _myField; }  
    set {   
        if (_myField == value)  
            return;  

        _myField = value;   

        OnPropertyChanged("MyField");  
    }  
}  

هذا هو التنفيذ السليم من مكان الإقامة.

عند تغيير مكان الإقامة ، تأكد من أن نفس مثيل الكائن binded إلى السيطرة.وإلا فإن التغيير سيكون إخطار ولكن السيطرة لن تحصل عليه لأن السيطرة لا binded بشكل صحيح.

استبدال اضع في شكل

        set 
        {
            _name = "Some Name";
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.DataBind, 
                (SendOrPostCallback)delegate { OnPropertyChanged("Name"); },
                null);
        }

يحل المشكلة ولكنه لا يزال مفتوحا.لماذا يجب أن تجعل المتزامن الاتصال بدلا من متزامن مما يشير إلى أن العقار قد تغيرت.

إذا لم أكن مخطئا ، الافتراضي سلوك ملزمة من الخاصية Text في مربع النص TwoWay ، لذلك هذا يجب أن تعمل.يمكنك فرض أن يكون TwoWay في XAML مثل هذا:

<Window Title="Window1" Height="300" Width="300">
  <Grid>
    <StackPanel>
        <TextBox Text="{Binding Name, Mode=TwoWay}" Margin="10"/>
        <Button HorizontalAlignment="Center" 
        Content="Click Me" Margin="5" 
        Padding="2" Click="OnButtonClick" />
    </StackPanel>
  </Grid>
</Window>

ملاحظة Mode=TwoWay في إعلان ملزم.

إذا كان هذا لا يعمل, ثم وأظن أن استثناء هي التي القيت في المدونة أن الحرائق الحدث ، أو يعين مكان يجب أن ننظر في ذلك.


يبدو أن هناك احتمال أن كنت جعل الدعوة إلى تغيير القيمة على الموضوع هذا ليس UI.إذا كان هذا هو الحال, ثم إما أن المشير الدعوة إلى النار الملكية تغيرت الحدث على UI ، أو إجراء التغيير إلى قيمة UI.

عندما كائن منضم إلى عنصر واجهة المستخدم التغييرات إلى كائن التي يمكن أن تؤثر على واجهة المستخدم يجب أن تتم على UI.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top