В качестве примера
У меня есть 2 текстовых поля.Текст обоих текстовых полей привязан к классу Name {String fullname, String funnyName};Они не связаны напрямую, но конвертером
Они реализуют INotifyChanged
, а предел DataContext
равен ObservableCollection
и всем другим стандартным вещам.
Этот шаблон связан так, чтобы у меня было 2 текстовых поля в одной строке, а список содержит 10 строк. Вопрос:
когда я меняю полное имя в текстовом поле 1, я иду и меняюfunnyname в связанной коллекции.
Это не отражается сразу на графическом интерфейсе.
Как мне этого добиться?Я не хочу обновлять весь список и не хочу напрямую связывать его с другим свойством в моем классе, но через конвертер.Конвертер не вызывается, когда свойство изменяется с «TOm» на «член», т. Е. Конвертер вызывается только в первый раз.Затем, когда изменяется какое-либо свойство и вызывается
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("FunnyName"));
, преобразователь не вызывается.
добавляет исходный код
класс коллекции
public class VariableData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
String _Source;
/// <summary>
/// Gets or sets the source.
/// </summary>
/// <value>
/// The source.
/// </value>
public String Source
{
get { return _Source; }
set
{
_Source = value; if (this.PropertyChanged != null)
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Source"));
}
}
}
переплет
<TextBox Name="textBoxFileLocation"
Text="{Binding Converter={StaticResource mapTypeToDataConverter}, ConverterParameter=41}"
Margin="5,5,5,5" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2">
</TextBox>
преобразователь
public class MapTypeToDataConverter : IValueConverter
{
#region IValueConverter Members
/// <summary>
/// Modifies the source data before passing it to the target for display in the UI.
/// </summary>
/// <param name="value">The source data being passed to the target.</param>
/// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param>
/// <param name="parameter">An optional parameter to be used in the converter logic.</param>
/// <param name="culture">The culture of the conversion.</param>
/// <returns>
/// The value to be passed to the target dependency property.
/// </returns>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return "";
VariableData cus = null;
try
{
cus = (VariableData)value;
}
catch (Exception e3)
{
return null;
}
if (cus == null)
return "";
int temp = int.Parse(parameter.ToString());
int mapType = temp / 10;
int whatToreturn = temp % 10;
if (mapType != cus.MappingType)
{
if (whatToreturn == 3)
return false;
else
return "";
}
switch (whatToreturn)
{
case 1:
return cus.Source;
break;
case 2:
return cus.Query;
break;
case 3:
if (cus.Source != null && cus.Source.Length > 0)
return true;
else
return false;
}
return "";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (int)value;
}
#endregion IValueConverter Members
}