使用值转换器绑定到Silverlight 4中的FontWeight
我想比较不同属性的两个版本,如果其中一个不等于另一个,则使用粗体。由于SL4不支持多重绑定,我将FontWeight绑定到“.”,以便将整个数据上下文传递给转换器。然后,我使用converter参数指定要在转换器内比较的字段。到目前为止,一切都很好。。。不匹配的值以粗体显示 问题是粗体属性绑定到一个可以编辑的文本框。编辑值时,我希望转换器“重新激活”,以便根据新值设置字体权重。这不会发生。如何做到这一点 注意:我已经为相关类和属性实现了INotifyPropertyChanged。更改值后切换到下一个字段会触发PropertyChanged事件,但字体大小不会更新,直到我实际移动到另一个记录,然后返回到已更改的记录使用值转换器绑定到Silverlight 4中的FontWeight,silverlight,xaml,binding,ivalueconverter,Silverlight,Xaml,Binding,Ivalueconverter,我想比较不同属性的两个版本,如果其中一个不等于另一个,则使用粗体。由于SL4不支持多重绑定,我将FontWeight绑定到“.”,以便将整个数据上下文传递给转换器。然后,我使用converter参数指定要在转换器内比较的字段。到目前为止,一切都很好。。。不匹配的值以粗体显示 问题是粗体属性绑定到一个可以编辑的文本框。编辑值时,我希望转换器“重新激活”,以便根据新值设置字体权重。这不会发生。如何做到这一点 注意:我已经为相关类和属性实现了INotifyPropertyChanged。更改值后切换到
(我还尝试使用Mode=TwoWay,看看是否可以。但是,当您绑定到“”时,不能使用TwoWay绑定)是否需要使用值转换器?我使用MVVM模式快速尝试了这个方法,效果非常好。如果您可以使用MVVM,您可以这样做: MainPage.xaml
<UserControl x:Class="BindBoldText.MainPage"
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"
xmlns:local="clr-namespace:BindBoldText"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.DataContext>
<local:MainPage_ViewModel/>
</UserControl.DataContext>
<StackPanel>
<TextBlock Text="{Binding Value1, Mode=TwoWay}"/>
<TextBlock Text="{Binding Value2, Mode=TwoWay}" FontWeight="{Binding Value2FontWeight}"/>
<TextBox Text="{Binding Value2, Mode=TwoWay}" TextChanged="TextBox_TextChanged"/>
</StackPanel>
主页_ViewModel.cs
public class MainPage_ViewModel : INotifyPropertyChanged
{
public string Value1
{
get { return value1; }
set
{
if (value1 != value)
{
value1 = value;
OnPropertyChanged("Value1");
}
}
}
private string value1 = "Test";
public string Value2
{
get { return value2; }
set
{
if (value2 != value)
{
value2 = value;
OnPropertyChanged("Value2");
OnPropertyChanged("Value2FontWeight");
}
}
}
private string value2 = "Test";
public FontWeight Value2FontWeight
{
get
{
if (value2.Equals(value1))
{
return FontWeights.Normal;
}
else
{
return FontWeights.Bold;
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
在您的解决方案中,不会更新该值,因为属性本身通过“.”表达式绑定到整个数据上下文。可以调用INotifyPropertyChanged,但此事件表示单个属性已更改,并且由于您在绑定表达式中未提供属性名称,因此数据绑定系统不知道需要更新绑定-它无法查看值转换器的功能
我认为JSprang的appraoch要好得多,至少因为它提供了更好的表示逻辑分离,可以从标记中测试。为了进一步使用干净的界面,您可以让ViewModel实现一个布尔属性“ValuesAreSame”,对其进行数据绑定,并使用值转换器应用实际的视觉样式(在本例中为字体权重)。感谢您的回答。(很抱歉耽搁了。我刚从一个短暂但急需的假期回来。:-)我将尝试这种方法以及下面Greeniccile的建议。在值转换器中不需要这样做。然而,我正试图结合RIA服务来实现这一点。当使用上面描述的MVVM方法与RIA服务一起使用时,有什么需要注意的地方吗?我试过了,它对我有效。不管好坏在RIA服务中,我可以使用.shared代码将“Value2FontWeight”属性(如上定义)添加到我的DTO中(在这种情况下,我认为它不再是严格意义上的DTO,但这没关系)。。。在RIA服务中使用这种方法似乎有一个小问题(如果您不使用视图模型的话)。为客户端生成的代码为属性提供了自己的setter方法,因此不会执行上述解决方案中对OnPropertyChanged(“Value2FontWeight”)的调用,因为它在生成的setter中不存在。感谢您的输入。JSprang的方法解决了这个问题,我喜欢你的建议,即通过将条件的评估与UI中的指示方式分离来保持界面干净。
public class MainPage_ViewModel : INotifyPropertyChanged
{
public string Value1
{
get { return value1; }
set
{
if (value1 != value)
{
value1 = value;
OnPropertyChanged("Value1");
}
}
}
private string value1 = "Test";
public string Value2
{
get { return value2; }
set
{
if (value2 != value)
{
value2 = value;
OnPropertyChanged("Value2");
OnPropertyChanged("Value2FontWeight");
}
}
}
private string value2 = "Test";
public FontWeight Value2FontWeight
{
get
{
if (value2.Equals(value1))
{
return FontWeights.Normal;
}
else
{
return FontWeights.Bold;
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}