[英]Error Binding a property of a user control wp7
我創建了一個用戶控件以在應用程序周圍的多個地方使用它,該控件具有兩個屬性,將女巫值綁定到viewmodel。 問題是當應用程序正在加載時,它會在設置用戶控件的屬性之一時引發異常,您知道嗎?
用戶控件
<UserControl x:Class="Client.Controls.CredentialsUserControl"
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"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="480" d:DesignWidth="480">
<Grid Name="LayoutRoot">
<TextBlock Text="{Binding Title}" Margin="12,20,12,390" TextWrapping="Wrap" FontSize="30"/>
<TextBlock Text="Username" Margin="39,88,260,362" FontSize="25"/>
<TextBlock Text="{Binding Credentials.User}" Margin="361,88,0,362" FontSize="25" />
<TextBlock Text="Password" Margin="39,148,260,302" FontSize="25"/>
<TextBlock Text="{Binding Credentials.Password}" Margin="361,148,0,302" FontSize="25" />
</UserControl>
UserControl.xaml.cs
public partial class CredentialUserControl: UserControl , INotifyPropertyChanged
{
public const string CredentialsPropertyName = "Credentials";
private ICredentials _credentials= null;
public ICredentials Credentials
{
get
{
_credentials_report;
}
set
{
if (_credentials== value)
{
return;
}
_credentials= value;
NotifyPropertyChanged(CredentialsPropertyName );
}
}
public string Title { get; set; }
public MobfoxReportUserControl()
{
InitializeComponent();
Loaded += PageLoaded;
}
void PageLoaded(object sender, RoutedEventArgs e)
{
this.DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string prop)
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
用法:
<Controls:CredentialsUserControl Title="Your Credentials" Credentials="{Binding CurrentUser}"/>
ViewModel屬性片段與UserControl.xaml.cs中顯示的相同
拋出異常
System.Windows.Markup.XamlParseException occurred
Message=Set property 'CredentialsUserControl.Credentials' threw an exception. [Line: 29 Position: 85]
InnerException: System.ArgumentException
Message=ArgumentException
StackTrace:
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
at System.Reflection.RuntimePropertyInfo.InternalSetValue(PropertyInfo thisProperty, Object obj, Object value, Object[] index, StackCrawlMark& stackMark)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
我發現異常的根源是MainPage上的綁定,但並沒有真正理解引起該異常的原因或原因。
謝謝
通過在用戶控件內顯式設置DataContext
,您將丟失它。 另外,您應該使用DependencyProperty
。 最后,您的XAML加載了精確的邊距...您可能希望切換為使用“網格行/列”定義,就像您需要更改頁面一樣,這將變得更加容易。
using System.Net;
using System.Windows;
using System.Windows.Controls;
namespace Client.Controls
{
public partial class CredentialsUserControl : UserControl
{
public CredentialsUserControl()
{
InitializeComponent();
if (System.ComponentModel.DesignerProperties.IsInDesignTool)
{
Credentials = new NetworkCredential("user","pass");
Title = "testing creds";
}
}
public ICredentials Credentials
{
get { return (ICredentials)GetValue(CredentialsProperty); }
set { SetValue(CredentialsProperty, value); }
}
// Using a DependencyProperty as the backing store for Credentials. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CredentialsProperty =
DependencyProperty.Register("Credentials", typeof(ICredentials), typeof(CredentialsUserControl),new PropertyMetadata(null));
public string Title { get; set; }
}
}
<Grid Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding ElementName=control, Path=Title}" TextWrapping="Wrap" FontSize="30" Margin="12,24" />
<Grid Grid.Row="1" Margin="40,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="12" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="Username" FontSize="25" Grid.Column="0" />
<TextBlock Text="{Binding ElementName=control, Path=Credentials.User}" FontSize="25" Grid.Column="1" HorizontalAlignment="Right"/>
<TextBlock Text="Password" Grid.Row="2" FontSize="25" Grid.Column="0" />
<TextBlock Text="{Binding ElementName=control, Path=Credentials.Password}" Grid.Row="2" FontSize="25" Grid.Column="1" HorizontalAlignment="Right"/>
</Grid>
</Grid>
我不確定,但是構造函數中的這段代碼是什么:
LayoutRoot.DataContext = this;
this.DataContext = this;
看起來“危險” ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.