作为一个例子
我有两个文本框。两个文本框的文本都绑定到类Name {String fullname,String funnyName};它们不是直接绑定,而是由转换器
他们正在实施INotifyChanged
,并且绑定的DataContext
是ObservableCollection
以及所有其他标准内容。
此模板已绑定,因此我在一行中有两个文本框,而列表框有10行 问题是:
当我在文本框1中更改全名时,我去更改绑定集合中的funnyname。
这不会立即反映在GUI上。
我怎样才能做到这一点?我不想更新整个列表框,我不想直接将它绑定到我的类中的另一个属性,而是通过转换器。当属性从“TOm”变为“dick”时,转换器不会被调用,即转换器仅被称为第一次。每当某个属性发生变化时
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
}
答案 0 :(得分:1)
您是否在XAML中设置了Mode=TwoWay
:
<TextBox Text="{Binding MyProperty, Mode=TwoWay, Converter={StaticResource myConverter}}" />
(目前不在IDE,因此可能存在拼写错误)
这意味着当{1}}发生变化时,用户界面会发生变化,而当用户界面发生变化时,会更新MyProperty
。
答案 1 :(得分:1)
您似乎将整个VariableData
绑定为值,然后使用转换器提取所需的输出。由于VariableData
实例本身没有变化(您的ConvertBack
未返回类型为VariableData
的新对象),因此用户界面没有理由相信它需要更新其UI
您应该做的是删除转换器并绑定到VariableData
的属性,将您需要的逻辑移动到VariableData
中,根据需要创建其他属性。如果更改一个属性也会影响另一个属性,则可以确保为这两个属性引发PropertyChanged
个事件。