كيف يمكنني تجنب التكرار عند تحديث بلدي ViewModel الخصائص ؟

StackOverflow https://stackoverflow.com/questions/1012812

  •  06-07-2019
  •  | 
  •  

سؤال

في وجهة نظري أنا المنزلق و تحرير وسرد.

عندما تغيير شريط التمرير, أريد تحرير وسرد إلى تغيير.

عندما تغيير مربع تحرير وسرد, أريد شريط التمرير لتغيير.

أنا يمكن أن udpate واحدة أو أخرى ، ولكن إذا حاولت تحديث كل من لي ستاكوفيرفلوو خطأ منذ خاصية واحدة تحافظ على تحديث الأخرى في حلقة لا نهائية.

لقد حاولت وضع في حساب() حيث تحديث يتم في مكان واحد, ولكن لا تزال تعمل في العودية المشكلة.

كيف يمكن أن يكون كل عنصر تحكم تحديث الأخرى دون الخوض في العودية?

في رأي:

<ComboBox 
    ItemsSource="{Binding Customers}"
    ItemTemplate="{StaticResource CustomerComboBoxTemplate}"
    Margin="20"
    HorizontalAlignment="Left"
    SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>


<Slider Minimum="0" 
        Maximum="{Binding HighestCustomerIndex, Mode=TwoWay}" 
        Value="{Binding SelectedCustomerIndex, Mode=TwoWay}"/>

في ViewModel:

#region ViewModelProperty: SelectedCustomer
private Customer _selectedCustomer;
public Customer SelectedCustomer
{
    get
    {
        return _selectedCustomer;
    }

    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("SelectedCustomer");
        SelectedCustomerIndex = _customers.IndexOf(_selectedCustomer);
    }
}
#endregion

#region ViewModelProperty: SelectedCustomerIndex
private int _selectedCustomerIndex;
public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        _selectedCustomerIndex = value;
        OnPropertyChanged("SelectedCustomerIndex");
        SelectedCustomer = _customers[_selectedCustomerIndex];
    }
}
#endregion
هل كانت مفيدة؟

المحلول

محاولة في تعيين الوظائف شيء من هذا القبيل:

public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        if (value != _selectedCustomerIndex)
        {
         _selectedCustomerIndex = value;
         OnPropertyChanged("SelectedCustomerIndex");
         SelectedCustomer = _customers[_selectedCustomerIndex];
        }
    }
}

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

عليك أن تفعل ذلك من أجل الممتلكات الأخرى وكذلك بالطبع.

نصائح أخرى

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

    public Customer SelectedCustomer
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomer = value;
            _selectedCustomerIndex = _customers.IndexOf(value);

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }

    public int SelectedCustomerIndex
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomerIndex = value;
            _selectedCustomer = _customers[_selectedCustomerIndex];

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top