5

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

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

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

(我还尝试使用 Mode=TwoWay 来查看是否可以解决问题。但是,当您绑定到“。”时,不能使用 TwoWay 绑定)

4

2 回答 2

2

你需要使用价值转换器吗?我使用 MVVM 模式快速尝试了这个,效果很好。如果你可以使用 MVVM,你可以这样做:

主页.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>

MainPage.xaml.cs

    public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        this.viewModel = this.DataContext as MainPage_ViewModel;
    }

    private MainPage_ViewModel viewModel;

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {            
        viewModel.Value2 = (sender as TextBox).Text;
    }
}

MainPage_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
}
于 2010-06-29T19:02:26.070 回答
0

在您的解决方案中,该值不会更新,因为属性本​​身通过“。”绑定到整个数据上下文。表达。可能会调用 INotifyPropertyChanged,但是这个事件意味着单个属性发生了变化,并且由于您没有在绑定表达式中提供属性名称,因此数据绑定系统不知道 Binding 需要更新 - 它不能看看你的价值转换器做了什么。

我认为 JSprang 的方法要好得多,至少因为它提供了更好的表示逻辑分离,可以与标记进行测试。为了进一步使用干净的界面,您可以让 ViewModel 实现一个布尔属性“ValuesAreSame”,对其进行数据绑定,并使用值转换器应用实际的视觉样式(在本例中为字体粗细)。

于 2010-07-03T18:17:13.013 回答