我有一个textBlock
<TextBlock Width="180" Text="{Binding Details, UpdateSourceTrigger=PropertyChanged}"
并在viewModel
中public string Details
{
get
{
string strInfo;
strInfo = Resources.SharedOn+": " + DateString;
strInfo += "\n"+Resources.Access+": " + AccessString;
if (ExpiryString != Resources.ShareExpireNever)
{
strInfo += "\n" + Resources.ShareExpire + ": " + ExpiryString;
}
if (Note != null && Note != "")
{
strInfo += "\n"+Resources.ShareNote+": " + Note;
}
return strInfo;
}
set
{
SetValue(DetailsProperty, value);
}
}
我希望以这样的方式绑定此属性:每当用户在UI中进行任何更改时,此TextBlock
这三个值会立即反映这些值。我添加了
UpdateSourceTrigger=PropertyChanged
但这不起作用。 任何想法为什么它不起作用?
答案 0 :(得分:0)
如果您的其他属性是依赖项属性,则应在其声明中设置PropertyMetadata。在那里,您可以指定属性更改的回调,您可以通过调用其setter来更新Details
属性。
public static readonly DependencyProperty NoteProperty =
DependencyProperty.Register("Note", typeof (string),
typeof (YourObject), new PropertyMetadata(String.Empty, UpdateDetails));
private static void UpdateDetails(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var o = (YourObject)d;
o.UpdateDetails();
}
private void UpdateDetails()
{
string strInfo;
strInfo = Resources.SharedOn + ": " + DateString;
strInfo += "\n" + Resources.Access + ": " + AccessString;
if (ExpiryString != Resources.ShareExpireNever)
{
strInfo += "\n" + Resources.ShareExpire + ": " + ExpiryString;
}
if (Note != null && Note != "")
{
strInfo += "\n" + Resources.ShareNote + ": " + Note;
}
Details = strInfo;
}
如果您的其他属性不是依赖项属性,那么您只需从其设置者中调用UpdateDetails
即可。
无论哪种方式,您都不应该修改依赖项属性的getter和setter。意思是,它们看起来像:
public string Details
{
get { return (string) GetValue(DetailsProperty); }
set { SetValue(DetailsProperty, value); }
}
没有任何自定义代码。
答案 1 :(得分:0)
我看到的主要问题是您尝试使用DP作为值转换器
不是在details属性中进行连接,而是使用多重绑定在GUI中进行,http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx
这将允许您将值转换器设置为转换和反转数据