【问题标题】:Bind Bool to Visibility of TextBlock within a ListBox将 Bool 绑定到 ListBox 中 TextBlock 的可见性
【发布时间】: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() {....}                    
}

【问题讨论】:

    标签: c# wpf xaml windows-phone-7 data-binding


    【解决方案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" ...
    • 我的错!感谢您如此快速的回复,它奏效了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2010-09-27
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多