Non riesco a trovare un semplice esempio di come in modo corretto implementare un usercontrol con WPF che ha una proprietà di dipendenza all'interno del framework MVVM . Il mio codice di seguito fallisce ogni volta che assegno l'usercontrol a un datacontext.Come associare correttamente a una proprietà di dipendenza di un usercontrol in un framework MVVM
sto provando a:
- Impostare la proprietà di dipendenza dal chiamante ItemsControl, e
- Fai il valore di quella proprietà di dipendenza a disposizione del ViewModel della chiamata UserControl.
Ho ancora molto da imparare e sinceramente apprezzo qualsiasi aiuto.
Questo è il comando ItemsControl nel più alto usercontrol che sta effettuando la chiamata al controllo usso di InkStringView con la proprietà di dipendenza TextInControl (esempio da un'altra domanda).
<ItemsControl
ItemsSource="{Binding Strings}" x:Name="self" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="v:InkStringView">
<Setter Property="FontSize" Value="25"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</DataTemplate.Resources>
<v:InkStringView TextInControl="{Binding text, ElementName=self}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Ecco l'usercontrol di InkStringView con la proprietà di dipendenza.
XAML:
<UserControl x:Class="Nova5.UI.Views.Ink.InkStringView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
x:Name="mainInkStringView"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding TextInControl, ElementName=mainInkStringView}" />
<TextBlock Grid.Row="1" Text="I am row 1" />
</Grid>
Code-Behind file:
namespace Nova5.UI.Views.Ink
{
public partial class InkStringView : UserControl
{
public InkStringView()
{
InitializeComponent();
this.DataContext = new InkStringViewModel(); <--THIS PREVENTS CORRECT BINDING, WHAT
} --ELSE TO DO?????
public String TextInControl
{
get { return (String)GetValue(TextInControlProperty); }
set { SetValue(TextInControlProperty, value); }
}
public static readonly DependencyProperty TextInControlProperty =
DependencyProperty.Register("TextInControl", typeof(String), typeof(InkStringView));
}
}
Il DataContext dei controlli nel ItemTemplate di un ItemsControl (o qualsiasi classe derivata) viene automaticamente assegnato da WPF all'elemento rispettivo nella raccolta di origine. Nel tuo caso questo sarebbe un elemento dalla collezione 'String'. Se 'Stringhe' è una raccolta di oggetti che hanno una proprietà' text', devi semplicemente scrivere il binding nel DataTemplate come 'TextInControl =" {Binding text} "' e * non impostare esplicitamente * nessun altro DataContext. Suggerirei di leggere su questo argomento. – Clemens
Vedere [Panoramica di associazione dati] (http://msdn.microsoft.com/en-us/library/ms752347.aspx) e [Panoramica Templatura dati] (http://msdn.microsoft.com/en-us/library /ms742521.aspx). – Clemens
@Clemens Ciao. L'eliminazione di ElementName = ... dal ItemsControl chiamante continua a essere visualizzato con "I am row 1" e una riga vuota dove dovrebbe essere il testo sulla riga 0. ??? Idee? –