将 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&lt;phone:PhoneApplicationPage ....... **Title="MyPage**" &gt; 并将我的绑定更改为 Visibility="Binding DataContext.MyVb.Visible, ElementName=MyPage, Converter=StaticResource BoolToVisConverter" ,但现在无论 booltrue 还是 false,第一个 textblock 中的 text 是没有出现,尽管那个地方出现了空白。我做错了吗? 应该是:&lt;phone:PhoneApplicationPage Name="MyPage" ... 我的错!感谢您如此快速的回复,它奏效了:)

以上是关于将 Bool 绑定到 ListBox 中 TextBlock 的可见性的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项

数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化

WPF 将 ListBox 绑定到枚举,显示描述属性

将 ListBox(或 Telerik RadListPicker)绑定到 Enum

如何将 DataTable.Select() 的结果绑定到 ListBox 控件?

MVVM:将带有 Observable 集合的命令绑定到 Listbox 并从文本框中获取值