Pregunta

Quiero comparar dos versiones de varias viviendas y de una negrita de ellos si no es igual a la otra. Desde SL4 no soporta MultiBinding Soy la unión del FontWeight a "" de manera que todo el contexto de datos se pasa al convertidor. Luego utilizo el parámetro del convertidor para especificar qué campos para comparar dentro del convertidor. Hasta ahora, todo bien ... Valores que no coinciden están en negrita.

El problema es que la propiedad en negrita se enlaza a un cuadro de texto que puede ser editado. Cuando se edita el valor, quiero que el convertidor para ser "re-activa", por lo que el peso de la fuente se establece de acuerdo a la nueva valor. Esto no sucede. ¿Cómo se puede lograr esto?

Nota: Ya he implementado INotifyPropertyChanged para la clase y las propiedades relevantes. Tabulación al siguiente campo después de cambiar el valor hace que el evento PropertyChanged al fuego, pero el peso de la fuente no se actualiza hasta que en realidad se mueven a un registro diferente y luego volver al registro que se ha cambiado .

(I también trató con el Modo = TwoWay para ver si eso fuera a hacer el truco. Sin embargo, TwoWay vinculante no se puede utilizar cuando desee realizar la vinculación "")

¿Fue útil?

Solución

¿Necesita utilizar un convertidor de valores? Probé esto rápido utilizando el patrón MVVM y funcionó bastante bien. Si se pudiera usar MVVM, que posiblemente podría hacerlo de esta manera:

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
}

Otros consejos

En su solución, el valor no se actualiza debido a que la propiedad en sí está obligado contra todo el contexto de datos a través de la "" expresión. INotifyPropertyChanged puede ser llamado, pero esto significa caso de que una sola propiedad ha cambiado, y ya no se proporciona un nombre de propiedad en la expresión de enlace, el sistema de enlace de datos no sabe que las necesidades de encuadernación que se actualizan - no puede mirar en lo que hace su convertidor de valores.

creo appraoch de JSprang es mucho mejor, no por lo menos, ya que proporciona una mejor separación de la lógica de presentación que puede ser probado de la marca. Para ir más allá con una interfaz limpia, se puede dejar que el modelo de vista implementar una propiedad booleana "ValuesAreSame", los datos-se unen en contra de ella, y utilizar un convertidor de valores para aplicar el estilo visual real (en este caso, un grosor de fuente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top