Привязка к FontWeight в Silverlight 4 с использованием преобразователя значений - PullRequest
5 голосов
/ 24 июня 2010

Я хочу сравнить две версии различных свойств и выделить один из них, если он не равен другому.Поскольку SL4 не поддерживает MultiBinding, я привязываю FontWeight к "."так что весь контекст данных передается в конвертер.Затем я использую параметр конвертера, чтобы указать, какие поля сравнивать в конвертере.Пока все хорошо ... Значения, которые не совпадают, выделены жирным шрифтом.

Проблема в том, что свойство bolded привязано к текстовому полю, которое можно редактировать.Когда значение будет отредактировано, я хочу, чтобы преобразователь был «повторно активирован», чтобы вес шрифта устанавливался в соответствии со значением new .Этого не происходитКак это можно сделать?

Примечание. Я уже реализовал INotifyPropertyChanged для соответствующего класса и свойств.Переход к следующему полю после изменения значения вызывает событие PropertyChanged, но вес шрифта не обновляется , пока я фактически не перейду к другой записи, а затем вернусь к записи, которая была изменена .

(Я также попытался использовать Mode = TwoWay, чтобы проверить, справится ли это с задачей. Однако привязка TwoWay не может использоваться, когда вы привязываетесь к «.»)

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Вам нужно использовать конвертер значений?Я попробовал это быстро, используя шаблон 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>

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
}
0 голосов
/ 03 июля 2010

В вашем решении значение не обновляется, поскольку само свойство связано со всем контекстом данных через "." выражение. Можно вызывать INotifyPropertyChanged, но это событие означает, что изменилось одно свойство, и поскольку вы не предоставляете имя свойства в выражении привязки, система привязки данных не знает, что привязка должна быть обновлена ​​- она ​​не может посмотрите, что делает ваш конвертер значений.

Я думаю, что оценка JSprang намного лучше, по крайней мере, потому что она обеспечивает лучшее отделение логики представления, которая может быть проверена от разметки. Чтобы пойти дальше с чистым интерфейсом, вы можете позволить ViewModel реализовать логическое свойство «ValuesAreSame», привязать данные к нему и использовать преобразователь значений для применения фактического визуального стиля (в данном случае веса шрифта).

...