运行时访问DataTemplate控件

本文关键字:控件 DataTemplate 访问 运行时 | 更新日期: 2024-09-23 16:33:00

我在Windows phone 8.1上工作。我正在制作一个简单的ListView演示,它包含两个图像和两个文本块。

     <ListView x:Name="lst1" Grid.ColumnSpan="2"  >
        <ListView.ItemTemplate>
        <DataTemplate >
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Image x:Name="imgSender" Source="Assets/button_register.png"  Stretch="None" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="8,15,8,8" />
                        <TextBlock  Text="{Binding Sender}" FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,12,0,0"/>
                    <Image x:Name="imgReceiver" Source="Assets/button_register.png"  Grid.Row="1" Stretch="None" VerticalAlignment="Top" Margin="4,0" />
                    <TextBlock Text="{Binding Receiver}"  FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Grid.Row="1"  VerticalAlignment="Top"/>
                    <Image Source="Assets/scroll_line_addcategory.png" Grid.Row="2" Stretch="None" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="4,8,4,0" />
                </Grid>

            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我的问题是,我想在运行时在Xaml.cs文件中设置"imgSender"的可见性。Anybuddy对数据模板包含的访问UI控件有任何想法吗。

运行时访问DataTemplate控件

 <ListView x:Name="lst1" Grid.ColumnSpan="2"  >
        <ListView.ItemTemplate>
        <DataTemplate >
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Image  Visibility="{Binding SenderVisibility}" x:Name="imgSender" Source="Assets/button_register.png"  Stretch="None" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="8,15,8,8" />
                        <TextBlock  Text="{Binding Sender}" FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,12,0,0"/>
                    <Image x:Name="imgReceiver" Source="Assets/button_register.png"  Grid.Row="1" Stretch="None" VerticalAlignment="Top" Margin="4,0" />
                    <TextBlock Text="{Binding Receiver}"  FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Grid.Row="1"  VerticalAlignment="Top"/>
                    <Image Source="Assets/scroll_line_addcategory.png" Grid.Row="2" Stretch="None" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="4,8,4,0" />
                </Grid>

            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我的模范班是公共类User:INotifyPropertyChanged{private string sender=字符串。空的private string receiver=字符串。空的private string senderVisibility=字符串。空的private string receiverVisibility=字符串。空的公共字符串发件人{收到{退货发件人;}设置{if(value!=this.sender){this.sender=值;NotifyPropertyChanged("发件人");}}}

    public string Receiver
    {
        get
        {
            return this.receiver;
        }
        set
        {
            if (value != this.receiver)
            {
                this.receiver = value;
                NotifyPropertyChanged("Receiver");
            }
        }
    }
    public string ReceiverVisibility
    {
        get
        {
            return this.receiverVisibility;
        }
        set
        {
            if (value != this.receiverVisibility)
            {
                this.receiverVisibility = value;
                NotifyPropertyChanged("ReceiverVisibility");
            }
        }
    }
    public string SenderVisibility
    {
        get
        {
            return this.senderVisibility;
        }
        set
        {
            if (value != this.senderVisibility)
            {
                this.senderVisibility = value;
                NotifyPropertyChanged("SenderVisibility");
            }
        }
    }
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

如果你的ListView只包含一个项目,你可以很容易地订阅imgSenderLoaded事件,然后控制它的Visibility

private Image _imgSender;
void Image_Loaded(object sender, RoutedEventArgs e)
{
     _imgSender = sender as Image();
}
void AnotherMethod()
{
      if (_imgSender != null)
         _imgSender.Visibility = Visibility.Collapsed;
}

编辑对于多个项目

void HideImage(int elementIndex)
{
    var container = lst1.ContainerFromIndex(elementIndex) as ListViewItem;
   var imageSender = (container.Content as Grid).Children[0] as Image;
   imageSender.Visibility = Visibility.Collapsed;
}

您可以添加BooleanToVisibilityConverter

<Page.Resources>
    <converter:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Page.Resources>
<ListView x:Name="lst1" Grid.ColumnSpan="2"  
    ItemsSource="{Binding TelecomCollection}">
    <ListView.ItemTemplate>
    <DataTemplate >
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Image x:Name="imgSender" Source="Assets/button_register.png"  Stretch="None" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="8,15,8,8" 
                      Visibility="{Binding ShowImgReceiver, Converter={StaticResource BooleanToVisibilityConverter}}"/>
                    <TextBlock  Text="{Binding Sender}" FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Margin="0,12,0,0"/>
                <Image x:Name="imgReceiver" Source="Assets/button_register.png"  Grid.Row="1" Stretch="None" VerticalAlignment="Top" Margin="4,0" />
                <TextBlock Text="{Binding Receiver}"  FontSize="18" Foreground="Black" FontWeight="Bold" HorizontalAlignment="Center" Grid.Row="1"  VerticalAlignment="Top"/>
                <Image Source="Assets/scroll_line_addcategory.png" Grid.Row="2" Stretch="None" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="4,8,4,0" />
            </Grid>

        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

然后在您的物品类中,您可以添加ShowImgReceiver

public class Telecom
{
     string Receiver {get; set;}
     string Sender {get; set;}
     bool ShowImgReceiver{get; set;}
} 

在您的绑定类中

public class ViewModel
{
    public ObservableCollection<Telecom> TelecomCollection {get; set;}
}

如果您想使物品的图像可见性为Collapsed,则

 TelecomCollection[0].ShowImgReceiver = false;

并使其再次成为Visible

 TelecomCollection[0].ShowImgReceiver = true;