Код на самом деле является частью представления и на самом деле не аналогичен контроллеру, и обычно в них не должно быть много кода.Как правило, вы хотели бы большую часть вашей логики между «моделью представления», которая служит абстракцией представления, и «моделью», которая служит абстракцией бизнес-логики, с которой взаимодействует ваш пользовательский интерфейс.
В этомЯ думаю, что вам действительно нужна модель представления (VM), которая управляет несколькими представлениями.Это довольно типичный сценарий, и предпочтительный метод (во всяком случае, IMO) состоит в том, чтобы иметь модель иерархического представления, которая имеет модель приложения верхнего уровня, и несколько вспомогательных виртуальных машин, представляющих различные компоненты в вашем пользовательском интерфейсе, хотя вы можете связать все сVM верхнего уровня, если вы действительно хотите.
Для этого мы сначала определим нашу модель представления следующим образом:
public interface IGestureSink
{
void DoGesture();
}
public class MyControlVM : INotifyPropertyChanged, IGestureSink
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private ApplicationVM parent;
public MyControlVM(ApplicationVM parent)
{
this.Name = "my user control";
this.parent = parent;
parent.PropertyChanged += (s, o) => PropertyChanged(this, new PropertyChangedEventArgs("Visible"));
}
public String Name { get; set; }
public bool Visible { get { return parent.ControlVisible; } }
public void DoGesture()
{
parent.DoGesture();
}
}
public class ApplicationVM : INotifyPropertyChanged, IGestureSink
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public ApplicationVM()
{
this.ControlVM = new MyControlVM(this);
this.ControlVisible = false;
}
public MyControlVM ControlVM { get; private set; }
public bool ControlVisible {get; set;}
public void DoGesture()
{
this.ControlVisible = !this.ControlVisible;
PropertyChanged(this, new PropertyChangedEventArgs("ControlVisible"));
}
}
, а затем все, что нам нужно сделать, - это создать пользовательский элемент управления
<UserControl x:Class="WpfApplication2.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Background="LightBlue">
<Label Content="{Binding Name}"/>
</Grid>
</UserControl>
и стр.
<Window xmlns:my="clr-namespace:WpfApplication2" x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<my:MyControl Width="200" Height="200" x:Name="myUserControl" DataContext="{Binding ControlVM}" Visibility="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="222,262,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
Вот и используйте его.Единственное, что нам нужно в нашем коде, - это конструктор, который настраивает виртуальную страницу и проводку от нашей кнопки к модели представления.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ApplicationVM();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
((IGestureSink)(this.DataContext)).DoGesture();
}
}
Если вы хотите использовать вместо этого модель монолитного представления, вы быиспользуйте это вместо привязки DataContext к ControlVM
:
<my:MyControl Width="200" Height="200" x:Name="myUserControl" DataContext="{Binding DataContext}" Visibility="{Binding ControlVisible,Converter={StaticResource BooleanToVisibilityConverter}}"/>