Итак, вот проблема, против которой я бьюсь головой: у меня есть пользовательский элемент управления, который предоставляет два свойства зависимостей, которые привязаны к моей ViewModel. В моей ViewModel у меня есть экземпляр класса, который содержит несколько свойств, которые выражают значения, которые относятся к пользовательскому элементу управления, а также к элементам, которыми управляет элемент управления. Вот небольшой пример кода, чтобы объяснить это визуально, так что вот простой пример моего управления, это Slider, который сочетается с флажком, который позволяет пользователю заблокировать слайдер.
<custom:SliderControl IsLocked="{Binding Path=CustomClass.IsLocked, Mode=TwoWay}" SliderValue="{Binding Path=CustomClass.Value, Mode=TwoWay}" />
IsLocked и SliderValue являются свойствами зависимостей, которые эффективно управляют флажками и ползунками, содержащимися в настраиваемом элементе управления. Все функции управления работают, как и предполагалось, за исключением привязок к классу, который я определил. Если я создаю отдельные свойства, например, в одном свойстве int и одном свойстве bool, привязки работают так, как задумано. Однако у меня есть пять слайдеров, и каждый слайдер в моем реальном коде имеет пять свойств, которые связаны с ними. Я пытаюсь устранить дублирование кода, создав класс для хранения этих свойств в повторно используемом объекте, сократив мои 25 свойств до 5 экземпляров класса.
Мой CustomClass наследует ObservableObject и имеет свойство bool и свойство int с именами IsLocked и SliderValue соответственно. Для большего количества наглядных пособий вот как это выглядит:
public class CustomClass : ObservableObject
{
public const string SliderValuePropertyName = "SliderValue";
private int _sliderValue= 0;
public int SliderValue
{
get
{
return _sliderValue;
}
set
{
if (_sliderValue== value)
{
return;
}
_sliderValue= value;
RaisePropertyChanged(SliderValuePropertyName );
}
}
public const string IsCheckedPropertyName = "IsChecked";
private bool _isChecked = false;
public bool IsChecked
{
get
{
return _isChecked;
}
set
{
if (_isChecked == value)
{
return;
}
_isChecked = value;
RaisePropertyChanged(IsCheckedPropertyName);
}
}
Свойство ViewModel очень похоже и выглядит следующим образом, при загрузке ViewModel создается новый экземпляр класса:
public const string SliderOnePropertyName = "SliderOne";
private CustomClass _sliderOne;
public CustomClass SliderOne
{
get
{
return _sliderOne;
}
set
{
if (_sliderOne== value)
{
return;
}
_sliderOne= value;
RaisePropertyChanged(SliderOnePropertyName );
}
}
Почему обновление свойства зависимости, связанного со свойством в классе, не будет обновляться должным образом? Это потому, что вы не можете должным образом обновить свойство экземпляра класса и вместо этого должны обновлять весь экземпляр класса всякий раз, когда происходят изменения? Или мне нужно дополнительно настроить сеттер в этом свойстве ViewModel? В настоящее время изменение значения ползунка или флажка никогда не затрагивает связанное свойство и ничего не выдает ошибки при отладке.
РЕДАКТИРОВАТЬ: Я также окружил элемент управления в Border и установил DataContext Border UIElement для класса, а затем применил более простую привязку пути к базовому пользовательскому элементу управления. Это, однако, не повлияло на мою проблему.
Я доморощенный программист, поэтому я часто скучаю по вещам, когда собираю код, и полагаю, что это именно тот случай, если то, что я пытаюсь, просто не сработает.
Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ: Итак, я возился с использованием пользовательского события, которое сообщит мне, когда изменится конкретное свойство пользовательского элемента управления, и затем связал это событие в моей модели представления для обновления существующего класса. Это работает, но все равно создает дублирование кода, так как теперь у меня должно быть 10 событий, по 2 события на элемент управления, одно для проверки, когда изменяется значение ползунка, и другое, чтобы определить, когда изменяется флажок IsChecked. Такое дублирование кода существует, поскольку вы не можете направить несколько параметров команды (например, простой строковый идентификатор, для которого манипулируется ползунок, а также значение, которое вы хотите использовать в коде). Это ограничение означает, что я не могу просто использовать 2 события, которые различают, какой элемент управления претерпевает изменения в пределах определенного метода, так как раскрытие физического элемента управления ViewModel нарушает шаблон MVVM. Использование класса в качестве datacontext для пользовательского элемента управления сделало его таким, что мне было все равно, каким элементом управления манипулировали, поскольку у каждого из них был свой экземпляр класса. Используя события, это раскрывает паттерн MVVM, так как теперь мне нужно знать, каким из пяти элементов управления манипулирует пользователь.
Не может быть так сложно использовать класс в привязках свойств. Я должен пропустить что-то исправительное.