我有一个WPF网格,由代码创建。在网格单元内部,有边界。边框包含包含文本的文本框。
我想根据文本块中的内容更改文本的可见性。如果文本发生更改,可见性也应该随之更改,具体取决于文本的新值。
如何激发Text_Changed事件?我必须安排一个新的活动吗?我应该创建一个rouunted事件还是仅仅创建一个C#事件。
最简单的方法可能是将文本框可见性绑定到文本,并编写一个转换器来检查文本并返回适当的可见性值。这里有一个例子:
转换器:
public class TextToVisibilityConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string text = value as string;
//Write your condition here
if (text == "foo")
return Visibility.Hidden;
else
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
在资源部分添加:
<l:TextToVisibilityConverter x:Key="myConverter"/>
你把你的文本块设置成这样:
<TextBlock Visibility="{Binding Text, RelativeSource={RelativeSource Self}, Converter={StaticResource myConverter}}" .../>
通过这种方式,无论文本如何更改,都将在转换器内部计算可见性。您不需要TextChanged事件。
如果你需要在后面的代码中创建绑定,你可以写这样的东西:
//Create just one instance of this converter and then reuse for all bindings.
IValueConverter converter = new TextToVisibilityConverter();
//Now you can bind the text and the visibility
Binding myBinding = new Binding("Text");
myBinding.Source = textBlock;
myBinding.Converter = converter;
textBlock.SetBinding(TextBlock.VisibilityProperty, myBinding);