如何將數據綁定到只有getter而沒有setter的數據從wpf中的視圖模型訪問它?我正在與PasswordBox
合作,並希望將其SecureString
屬性綁定到ViewModel屬性。我怎樣才能做到這一點?數據綁定屬性沒有設置器
4
A
回答
0
綁定在XAML:
<PasswordBox Text="{Binding SecureString, Mode=OneWay}"...
,如果你不希望它從XAML綁定
public string SecureString
{
get { return _secureString;}
private set
{
if(_secureString == value) return;
_secureString = value;
RaisePropertyChanged(() => SecureString);
}
public void SetSecureString(string newSecureString)
{
SecureString = newSecureString;
}
改變您的視圖模型的消費者應該能夠設置SecureString
雖然這種方法..
1
我使用這個類和System.Windows.Interactivity庫來訪問沒有setter的屬性:
public sealed class PropertyManager : TriggerAction<FrameworkElement>
{
#region Fields
private bool _bindingUpdating;
private PropertyInfo _currentProperty;
private bool _propertyUpdating;
#endregion
#region Dependency properties
/// <summary>
/// Identifies the <see cref="Binding" /> dependency property.
/// </summary>
public static readonly DependencyProperty BindingProperty =
DependencyProperty.Register("Binding", typeof(object), typeof(PropertyManager),
new PropertyMetadata((o, args) =>
{
var propertyManager = o as PropertyManager;
if (propertyManager == null ||
args.OldValue == args.NewValue) return;
propertyManager.TrySetProperty(args.NewValue);
}));
/// <summary>
/// Identifies the <see cref="SourceProperty" /> dependency property.
/// </summary>
public static readonly DependencyProperty SourcePropertyProperty =
DependencyProperty.Register("SourceProperty", typeof(string), typeof(PropertyManager),
new PropertyMetadata(default(string)));
/// <summary>
/// Binding for property <see cref="SourceProperty" />.
/// </summary>
public object Binding
{
get { return GetValue(BindingProperty); }
set { SetValue(BindingProperty, value); }
}
/// <summary>
/// Name property to bind.
/// </summary>
public string SourceProperty
{
get { return (string)GetValue(SourcePropertyProperty); }
set { SetValue(SourcePropertyProperty, value); }
}
#endregion
#region Methods
/// <summary>
/// Invokes the action.
/// </summary>
/// <param name="parameter">
/// The parameter to the action. If the action does not require a parameter, the parameter may be
/// set to a null reference.
/// </param>
protected override void Invoke(object parameter)
{
TrySetBinding();
}
/// <summary>
/// Tries to set binding value.
/// </summary>
private void TrySetBinding()
{
if (_propertyUpdating) return;
PropertyInfo propertyInfo = GetPropertyInfo();
if (propertyInfo == null) return;
if (!propertyInfo.CanRead)
return;
_bindingUpdating = true;
try
{
Binding = propertyInfo.GetValue(AssociatedObject, null);
}
finally
{
_bindingUpdating = false;
}
}
/// <summary>
/// Tries to set property value.
/// </summary>
private void TrySetProperty(object value)
{
if (_bindingUpdating) return;
PropertyInfo propertyInfo = GetPropertyInfo();
if (propertyInfo == null) return;
if (!propertyInfo.CanWrite)
return;
_propertyUpdating = true;
try
{
propertyInfo.SetValue(AssociatedObject, value, null);
}
finally
{
_propertyUpdating = false;
}
}
private PropertyInfo GetPropertyInfo()
{
if (_currentProperty != null && _currentProperty.Name == SourceProperty)
return _currentProperty;
if (AssociatedObject == null)
throw new NullReferenceException("AssociatedObject is null.");
if (string.IsNullOrEmpty(SourceProperty))
throw new NullReferenceException("SourceProperty is null.");
_currentProperty = AssociatedObject
.GetType()
.GetProperty(SourceProperty);
if (_currentProperty == null)
throw new NullReferenceException("Property not found in associated object, property name: " +
SourceProperty);
return _currentProperty;
}
#endregion
}
要使用這個類在XAML您需要添加到System.Windows.Interactivity庫的引用,並添加這個命名空間:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:behaviors="clr-namespace:YOUR NAMESPACE WHERE YOU PUT THE PropertyManager CLASS"
您還需要指定要更新值的情況下,在這種情況下PasswordChanged
,並指定要綁定的屬性,在這種情況下Password
:
<PasswordBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="PasswordChanged">
<behaviors:PropertyManager
Binding="{Binding Path=MyPasswordProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SourceProperty="Password" />
</i:EventTrigger>
</i:Interaction.Triggers>
</PasswordBox>
這個類是通用的,可以與任何性質的工作還支持雙向綁定。
+0
棒極了!我沒有使用這個密碼箱,但@Victor Mukherjee問了一個很好的問題,甚至不知道它,你的答案是非常好的。 –
+0
我有點嫉妒,誰寫的PropertyManager類? –
0
您可以通過設置binding mode到OneWay
與Get only property
結合你的綁定 -
<PasswordBox Text="{Binding SecureString, Mode=OneWay}"
相關問題
- 1. 數據綁定屬性沒有找到
- 2. Angular沒有設置數據綁定
- 3. WPF ComboBox數據綁定ItemsSource item.ToString()屬性設置器。爲什麼?
- 4. 觸發器沒有綁定屬性
- 5. 設置數據綁定數據網格的行屬性
- 6. 自定義屬性沒有綁定的綁定屬性
- 7. 綁定的誤解沒有得到屬性設置
- 8. 如何使用自定義屬性設置數據綁定
- 9. 從轉發器數據綁定數據設置用戶控件的屬性
- 10. 屬性「System.Windows.Forms.Control.Right」沒有設置器
- 11. 屬性探索器:綁定數據源
- 12. f:setPropertyActionListener沒有設置屬性
- 13. 屬性沒有被設置
- 14. Servlet沒有設置屬性?
- 15. WPF自定義控件屬性沒有收到數據綁定
- 16. WPF - 路徑幾何...有沒有辦法綁定數據屬性?
- 17. 禁用ComboBox數據綁定SelectedItem屬性正在雙擊設置
- 18. 設置源屬性綁定位圖圖像時,數據庫
- 19. Silverlight:設置屬性直接刪除數據綁定?
- 20. 在屬性設置中綁定祖先
- 21. 在模板中設置綁定屬性
- 22. 將DataGridHyperlinkColumn綁定設置爲URI屬性
- 23. 設置類名綁定的屬性
- 24. 更新屬性。設置綁定
- 25. 設置屬性沒有設置其內部屬性
- 26. KnockoutJS數據綁定設置器
- 27. 數據綁定屬性的工作,但沒有更新
- 28. JSF自定義組件屬性設置器沒有調用ValueExpression
- 29. 。設置數據綁定
- 30. 屬性綁定沒有更新
要綁定到你的視圖模型一個只讀屬性? –
我是wpf和mvvm的新手。我想在我的viewmodel中獲得密碼的安全字符串,並且不會設置它。 –
你的問題是'PasswordBox'控件上的'SecureString'屬性是隻讀屬性,這意味着你不能從標記或代碼中設置。 –