WPF-usercontrol-Twoway-Bindung-Abhängigkeit-Eigenschaft
Erstellte ich eine Abhängigkeitseigenschaft in das Benutzersteuerelement, aber doch Veränderungen in der usercontrol wurde NICHT mitgeteilt das Viewmodel
Usercontrol
<UserControl x:Class="DPsample.UserControl1"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox x:Name="txtName"></TextBox>
</Grid>
UserControl.cs
///<summary>
///Interaction logic for UserControl1.xaml
///</summary>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
#region SampleProperty
public static readonly DependencyProperty SamplePropertyProperty
= DependencyProperty.Register("SampleProperty",
typeof(string),
typeof(UserControl1),
new PropertyMetadata(OnSamplePropertyChanged));
public string SampleProperty
{
get { return (string)GetValue(SamplePropertyProperty); }
set { SetValue(SamplePropertyProperty, value); }
}
static void OnSamplePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
(obj as UserControl1).OnSamplePropertyChanged(e);
}
private void OnSamplePropertyChanged(DependencyPropertyChangedEventArgs e)
{
string SamplePropertyNewValue = (string)e.NewValue;
txtName.Text = SamplePropertyNewValue;
}
#endregion
}
MainWindow
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DPsample" x:Class="DPsample.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:UserControl1 SampleProperty="{Binding SampleText,Mode=TwoWay}" HorizontalAlignment="Left" Margin="76,89,0,0" VerticalAlignment="Top" Width="99"/>
<Button Content="Show" HorizontalAlignment="Left" Margin="76,125,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>
MainWindow.cs
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var item = this.DataContext as MainViewModel;
MessageBox.Show(item.SampleText.ToString());
}
MainViewModel.cs
public class MainViewModel : NotifyViewModelBase
{
public MainViewModel()
{
this.SampleText = "test";
}
private string _sampleText;
public string SampleText
{
get { return _sampleText; }
set { _sampleText = value; OnPropertyChanged("SampleText"); }
}
}
Sie haben nicht codiert alles, was vergeht, wechselt der
muss ich die viewmodel für das usercontrol?
In diesem Fall nicht. Allerdings wird die UserControl-vielleicht auch direkt eine Bindung zu Ihrem view-Modell ist
TextBox.Text
Eigenschaft SampleProperty
. Sollten Sie auch ein verbindliches dort, mit RelativeSource={RelativeSource AncestorType=UserControl}
.muss ich die viewmodel für das usercontrol?
In diesem Fall nicht. Allerdings wird die UserControl-vielleicht auch direkt eine Bindung zu Ihrem view-Modell ist
SampleText
Eigenschaft. Dann gäbe es überhaupt keine Notwendigkeit für SampleProperty
.InformationsquelleAutor Spen D | 2014-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Binden die
TextBox.Text
Eigenschaft in das Benutzersteuerelement, um seineSampleProperty
wie diese:Nun konnte Sie einfach entfernen Sie Ihre
OnSamplePropertyChanged
Rückruf.Könnten Sie sich auch registrieren
SampleProperty
zu binden, zwei-Wege-standardmäßig so:InformationsquelleAutor Clemens
Einen alternativen Weg, dies zu tun ist eine ElementName-Bindung. Zunächst weisen Sie die
x:Name
Attribut auf das Benutzersteuerelement (zum Beispielx:Name="MyUC"
), dann ändern sich verbindlich an:InformationsquelleAutor Dabbas