C# 使用布尔值绑定Textblock的可见性不起作用

C# 使用布尔值绑定Textblock的可见性不起作用,c#,xaml,mvvm,windows-runtime,windows-phone,C#,Xaml,Mvvm,Windows Runtime,Windows Phone,我正在编写一个Windows Phone 8.1(WINRT)应用程序。我使用列表视图来填充项目: XAML: xmlns:ConvertersFile="using:DrFit.Converters" <Page.Resources> <ConvertersFile:BoolToVisConverter x:Key="BooleanToVisibilityConverter"/> </Page.Resources> <ListView

我正在编写一个Windows Phone 8.1(WINRT)应用程序。我使用列表视图来填充项目:

XAML:

xmlns:ConvertersFile="using:DrFit.Converters"

<Page.Resources>
       <ConvertersFile:BoolToVisConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>

<ListView x:Name="EquipmentListView" DataContext="{Binding}" SelectionChanged="EquipmentListView_SelectionChanged">                    
    <ListView.ItemTemplate>
        <DataTemplate> 
                <Grid>      
                        <TextBlock Text="{Binding EquipmentDetails}"                  
                        x:Name="EquipmentDetails"
                        Visibility="{Binding Path=ShowHide, Converter={StaticResource BooleanToVisibilityConverter}}"/>>
                        </TextBlock>
                </Grid>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
 class EquipmentClassTemporary
    {
        public string EquipmentTitle { get; set; }    
        public string EquipmentDetails { get; set; }
        public bool ShowHide { get; set; }

    }
ObservableCollection<EquipmentClassTemporary> EquipmentListViewList = new ObservableCollection<EquipmentClassTemporary>();
private void GenerateEquipmentListView()
{
    for(int i=0; i< SingletonInstance.strHeading.Length;i++)
    {
        EquipmentListViewList.Add(new EquipmentClassTemporary { EquipmentTitle = SingletonInstance.strHeading[i], EquipmentDetails = SingletonInstance.strEquipment[i],  ShowHide=false });
    }
    EquipmentListView.ItemsSource = EquipmentListViewList;
}

private void EquipmentListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0)
    {
        var ClickedItem = e.AddedItems[0];
        ((EquipmentClassTemporary)ClickedItem).ShowHide = true;
    }

    if (e.RemovedItems.Count > 0)
    {
        var UnClickedItem = e.RemovedItems[0];
        ((EquipmentClassTemporary)UnClickedItem).ShowHide = false;

    }
}
public class BoolToVisConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        try
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        catch
        {
            return Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        try
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
        }
        catch { }

        return Visibility.Collapsed;

    }
}
C#:

xmlns:ConvertersFile="using:DrFit.Converters"

<Page.Resources>
       <ConvertersFile:BoolToVisConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>

<ListView x:Name="EquipmentListView" DataContext="{Binding}" SelectionChanged="EquipmentListView_SelectionChanged">                    
    <ListView.ItemTemplate>
        <DataTemplate> 
                <Grid>      
                        <TextBlock Text="{Binding EquipmentDetails}"                  
                        x:Name="EquipmentDetails"
                        Visibility="{Binding Path=ShowHide, Converter={StaticResource BooleanToVisibilityConverter}}"/>>
                        </TextBlock>
                </Grid>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
 class EquipmentClassTemporary
    {
        public string EquipmentTitle { get; set; }    
        public string EquipmentDetails { get; set; }
        public bool ShowHide { get; set; }

    }
ObservableCollection<EquipmentClassTemporary> EquipmentListViewList = new ObservableCollection<EquipmentClassTemporary>();
private void GenerateEquipmentListView()
{
    for(int i=0; i< SingletonInstance.strHeading.Length;i++)
    {
        EquipmentListViewList.Add(new EquipmentClassTemporary { EquipmentTitle = SingletonInstance.strHeading[i], EquipmentDetails = SingletonInstance.strEquipment[i],  ShowHide=false });
    }
    EquipmentListView.ItemsSource = EquipmentListViewList;
}

private void EquipmentListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0)
    {
        var ClickedItem = e.AddedItems[0];
        ((EquipmentClassTemporary)ClickedItem).ShowHide = true;
    }

    if (e.RemovedItems.Count > 0)
    {
        var UnClickedItem = e.RemovedItems[0];
        ((EquipmentClassTemporary)UnClickedItem).ShowHide = false;

    }
}
public class BoolToVisConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        try
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        catch
        {
            return Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        try
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
        }
        catch { }

        return Visibility.Collapsed;

    }
}

设备详细信息文本块的可见性未更改

您需要添加以下代码来实现INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
然后从属性设置器调用OnPropertyChanged,如

    private bool showHide;

    public bool ShowHide
    {
        get { return showHide; }
        set { showHide = value;
        OnPropertyChanged("ShowHide"); }
    }

您需要添加以下代码来实现INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
然后从属性设置器调用OnPropertyChanged,如

    private bool showHide;

    public bool ShowHide
    {
        get { return showHide; }
        set { showHide = value;
        OnPropertyChanged("ShowHide"); }
    }

注册propertyChanged事件处理程序后,可以在该类中使用许多属性。不需要单独的“OnPropertyChanged”函数

public bool ShowHide
{
    get { return showHide; }
    set { showHide = value;
    OnPropertyChanged("ShowHide"); }
}

public int newProperty
{
    get { return _newProperty; }
    set { _newProperty = value;
    OnPropertyChanged("newProperty"); }
}

public string NewStringProp
{
    get { return _NewStringProp; }
    set { _NewStringProp = value;
    OnPropertyChanged("NewStringProp"); }
}

等等…

一旦注册propertyChanged事件处理程序,您就可以在该类中使用许多属性。不需要单独的“OnPropertyChanged”函数

public bool ShowHide
{
    get { return showHide; }
    set { showHide = value;
    OnPropertyChanged("ShowHide"); }
}

public int newProperty
{
    get { return _newProperty; }
    set { _newProperty = value;
    OnPropertyChanged("newProperty"); }
}

public string NewStringProp
{
    get { return _NewStringProp; }
    set { _NewStringProp = value;
    OnPropertyChanged("NewStringProp"); }
}

等等…

您可以尝试为属性show实现INotifyPropertychanged吗?您可以在INotifyPropertychanged中帮助我吗?您必须为您的项目类(
EquipmentClassTemporary
)实现
INotifyPropertychanged
)。当前,当您更改
ShowHide
auto属性值时,没有任何内容通知视图更新项绑定。请参阅答案(它也可以使用整洁的
CallerMemberName
属性来执行)。@Atif Shabeer请查看更新的答案您可以尝试为属性ShowHideCan实现INotifyPropertychanged吗?您可以在INotifyPropertychanged中帮助我吗?您必须为您的项目类实现
INotifyPropertychanged
EquipmentClassTemporary
)。当前,当您更改
ShowHide
auto属性值时,没有任何内容会通知视图更新项目绑定。请参阅答案(它还使用neat
CallerMemberName
属性执行此操作).@Atif Shabeer请查看更新的答案我还有一个图像源作为字符串:公共字符串ImageSource{get{return ImageSource;}set{ImageSource=value;OnPropertyChanged(“ImageSource”);}我是否需要使用两个PropertyChangedEventHandler和两个OnPropertyChanged方法?我还有一个图像源作为字符串:公共字符串ImageSource{get{return ImageSource;}set{ImageSource=value;OnPropertyChanged(“ImageSource”);}我是否需要使用两个PropertyChangedEventHandler和两个OnPropertyChanged方法?