Я боролся в демонстрационном проекте WPF. Я должен признать, что у меня есть много ограничений, которые усложняют код.
Основной элемент - это элемент управления, который наследуется от UserControl. Я бы хотел, чтобы его код был как можно более легким. Кроме того, я хотел бы иметь его XAML в ControlTemplate. Его код C# должен быть в выделенной ViewModel (этот пример для огромного проекта, и выделенная viewModel может помочь, сгруппировав все viewmodel. Но в любом случае, скажем, это обязательно). И последнее, но не менее важное: я хотел бы привязать 2 свойства этого элемента управления к внешним свойствам.
Вот мой файл MainWindow.xaml:
<Window x:Class="ViewModel_defined_in_ControlTemplate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ViewModel_defined_in_ControlTemplate"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<StackPanel>
<local:MyUserControl Template="{StaticResource TextBoxTemplate}"
NomPersonne="sg"/>
<Button Content="Click me!" Command="{Binding ElementName=MyViewModel,Path=ChangeTextBoxContent}" Width="100" HorizontalAlignment="Left"/>
</StackPanel>
</Grid>
</Window>
Кнопка просто меняет значение свойство зависимости NomPersonne (см. ниже). MyDictionary.xaml содержит ControlTemplate:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ViewModel_defined_in_ControlTemplate">
<ControlTemplate x:Key="TextBoxTemplate" TargetType="{x:Type local:MyUserControl}">
<Grid>
<Grid.DataContext>
<local:MyViewModel/>
</Grid.DataContext>
<TextBox Width="50" HorizontalAlignment="Left" Text="{TemplateBinding NomPersonne}"/>
</Grid>
</ControlTemplate>
</ResourceDictionary>
Я не знаю, где разместить свое свойство зависимости и как получить к нему доступ. Я попытался поместить его в MyUserControl:
namespace ViewModel_defined_in_ControlTemplate
{
public partial class MyUserControl : UserControl
{
public string NomPersonne
{
get { return (string)GetValue(NomPersonneProperty); }
set { SetValue(NomPersonneProperty, value); }
}
public static readonly DependencyProperty NomPersonneProperty =
DependencyProperty.Register("NomPersonne", typeof(string), typeof(MyUserControl), new PropertyMetadata(""));
}
}
, и теперь он доступен из XAML MyUserCOntrol, но тогда я не знаю, как получить к нему доступ, чтобы команда кнопки изменила свойство:
namespace ViewModel_defined_in_ControlTemplate
{
public class MyViewModel : ViewModelBase
{
public RelayCommand ChangeTextBoxContent = new RelayCommand(() =>
{
//...
}, () => true);
}
}
Я бы предпочел иметь свойство зависимости в viewmodel, но как в этом случае получить доступ к входу в XAML MyUserControl, в MainWindow?
спасибо.