将 Bool 绑定到 ListBox 中 TextBlock 的可见性
Posted
技术标签:
【中文标题】将 Bool 绑定到 ListBox 中 TextBlock 的可见性【英文标题】:Bind Bool to Visibility of TextBlock within a ListBox 【发布时间】:2015-09-25 23:32:52 【问题描述】:我想将textblock
中的textblock
中的visibility
绑定到我的ViewModel
中的bool
值。绑定到listbox
外的textblock
效果很好,但它不适用于listbox
内的textblock
。请帮忙!
xml代码:
<TextBlock x:Name="heading" Visibility="Binding MyVb.Visible, Converter=StaticResource BoolToVisConverter" Width="480"/>
<ListBox x:Name="lstBani1" ItemsSource="Binding Users">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock x:Name="tb1" Text="Binding string1" Visibility="Binding MyVb.Visible, Converter=StaticResource BoolToVisConverter" Width="480"/>
<TextBlock x:Name="tb2" Text="Binding string2" Width="480"/>
<TextBlock x:Name="tb3" Text="Binding string3" Width="480"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
cs代码:
public partial class Page1 : PhoneApplicationPage
public Page1()
ViewModel model = new ViewModel();
model.Users = GetUsers();
model.MyVb = new MyVisibility();
model.MyVb.Visible = false;
this.DataContext = model;
// View Model
public class ViewModel
public List<User> Users get; set;
public MyVisibility MyVb get; set;
// Bool to Visibility Converter
public class BooleanToVisibilityConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
throw new NotImplementedException();
// Property Classes
public class User
public string string1 get; set;
public string string2 get; set;
public string string3 get; set;
public class MyVisibility : INotifyPropertyChanged
private bool _Visible;
public event PropertyChangedEventHandler PropertyChanged;
public bool Visible
get return _Visible;
set
_Visible = value;
NotifyPropertyChanged("Visible");
public void NotifyPropertyChanged(string propertyName)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
private List<Bani> GetUsers() ....
【问题讨论】:
【参考方案1】:您的ListBox
绑定到Users
,因此列表中的每个项目都有一个DataContext
绑定到User
。因此,您的绑定试图在 User
类中查找属性,而不是父数据上下文。
给您的页面一个Name
并将您的绑定更改为以下内容:
Visibility="Binding DataContext.MyVb.Visible, ElementName=yourPageName, Converter=StaticResource BoolToVisConverter"
【讨论】:
我添加了 this<phone:PhoneApplicationPage ....... **Title="MyPage**" >
并将我的绑定更改为 Visibility="Binding DataContext.MyVb.Visible, ElementName=MyPage, Converter=StaticResource BoolToVisConverter"
,但现在无论 bool
是 true
还是 false
,第一个 textblock
中的 text
是没有出现,尽管那个地方出现了空白。我做错了吗?
应该是:<phone:PhoneApplicationPage Name="MyPage" ...
我的错!感谢您如此快速的回复,它奏效了:)以上是关于将 Bool 绑定到 ListBox 中 TextBlock 的可见性的主要内容,如果未能解决你的问题,请参考以下文章
WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项
数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化
将 ListBox(或 Telerik RadListPicker)绑定到 Enum