Создание универсального UserControl, к которому может обращаться другой вид
У меня есть UserControl A, приведенный ниже с двумя кнопками радио. Это представление UserControl имеет свою ViewModel.
Вопрос: У меня снова есть два представления: Создать и Изменить. Я хочу использовать вышеупомянутый UserControl в Create/Edit с требованием, чтобы я мог сделать радиокнопки или любой из элементов в UserControl видимыми или скрытыми в соответствии с требованием в представлении Create/Edit.
Например: Создать Может не требовать переключателей 1 и 2. Поэтому должен отображаться только прямоугольник. Любые входные данные, которые я предоставляю в списке или текстовом поле, должны быть обновлены в ViewModel UserControl, и результат поиска после нажатия кнопки должен быть соответствующим образом отправлен в Create/Edit. Примечание:Create/Edit имеют свои собственные ViewModels. Пожалуйста, предложите, какой подход лучше всего подходит для MVVM
Элемент управления должен быть помещен в выделенную серым цветом область, как показано в прямоугольнике для представления "Создание / редактирование".
2 ответа
Вы можете создать DependancyProperty внутри вашего UserControl, как
public static readonly DependencyProperty RadioButtonVisibilityProperty=
DependencyProperty.Register( "RadioButtonVisibility", typeof(Visibility),
typeof(MyUserControl));
public Visibility RadioButtonVisibility
{
get { return (Visibility)GetValue(RadioButtonVisibilityProperty); }
set { SetValue(RadioButtonVisibilityProperty, value); }
}
и внутри xaml вашего UserControl Установите видимость радиокнопки как
<RadioButton Visibility="{Binding Parent.RadioButtonVisibility,ElementName=LayoutRoot}"/>
и в вашем основном представлении (создать / редактировать) сделать так
<MyUserControl x:Name="Edit" RadioButtonVisibility="Visible"/>
или же
<MyUserControl x:Name="Create" RadioButtonVisibility="Hidden"/>
И не забудьте дать родительской Grid вашей UserControl имя "LayoutRoot"
лайк
<Grid x:Name="LayoutRoot"/>
Это может быть хорошей идеей иметь UserControl
руководствоваться какой-то абстрактной BaseViewModel
, Затем вы создаете два подкласса EditViewModel
а также CreateViewModel
который вы затем используете на основе контекста.
Быстрый грубый пример для радио кнопок:
public abstract class BaseViewModel
{
public bool ShowRadioButtons { get; protected set; }
}
public class EditViewModel : BaseViewModel
{
public EditViewModel()
{
ShowRadioButtons = true;
}
}
public class CreateViewModel : BaseViewModel
{
public CreateViewModel()
{
ShowRadioButtons = false;
}
}