使用值转换器绑定到Silverlight 4中的FontWeight

使用值转换器绑定到Silverlight 4中的FontWeight,silverlight,xaml,binding,ivalueconverter,Silverlight,Xaml,Binding,Ivalueconverter,我想比较不同属性的两个版本,如果其中一个不等于另一个,则使用粗体。由于SL4不支持多重绑定,我将FontWeight绑定到“.”,以便将整个数据上下文传递给转换器。然后,我使用converter参数指定要在转换器内比较的字段。到目前为止,一切都很好。。。不匹配的值以粗体显示 问题是粗体属性绑定到一个可以编辑的文本框。编辑值时,我希望转换器“重新激活”,以便根据新值设置字体权重。这不会发生。如何做到这一点 注意:我已经为相关类和属性实现了INotifyPropertyChanged。更改值后切换到

我想比较不同属性的两个版本,如果其中一个不等于另一个,则使用粗体。由于SL4不支持多重绑定,我将FontWeight绑定到“.”,以便将整个数据上下文传递给转换器。然后,我使用converter参数指定要在转换器内比较的字段。到目前为止,一切都很好。。。不匹配的值以粗体显示

问题是粗体属性绑定到一个可以编辑的文本框。编辑值时,我希望转换器“重新激活”,以便根据新值设置字体权重。这不会发生。如何做到这一点

注意:我已经为相关类和属性实现了INotifyPropertyChanged。更改值后切换到下一个字段会触发PropertyChanged事件,但字体大小不会更新,直到我实际移动到另一个记录,然后返回到已更改的记录


(我还尝试使用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
}