WPF 触发元素之间的用户控件内的事件



我有一个有两个网格的列表视图项。当用户单击第一个网格时,它会显示第二个网格。但由于它是一个用户控件,我在代码隐藏中找不到它。

<UserControl>
    <ListView>
        <ListView.ItemTemplate>
            <DataTemplate DataType="models:Tweet">
                <ListViewItem>
                    <Grid Name="Grid1" OnMouseLeftDown="ShowsGrid2"/>
                    <Grid Name="Grid2"/>
                </ListViewItem>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem" BasedOn="{StaticResource {x:Type ListViewItem}}">
                <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
</UserControl>
public void PreviewMouseLeftButtonDown(object sender)
{
    var control = (Grid)sender;
    sender.Visibility = Visibility.Visible;
}

但我得到:控制=空异常

我建议在你的代码隐藏中创建一个属性:

public Visibility Grid2Visibility { get; set; }

然后,在 XAML 中将网格的可见性绑定到该属性:

<Grid ... Visibility="{Binding Grid2Visibility}" ... />

然后,您可以处理所需的任何事件,并相应地设置 Grid2 的可见性:

public void HandleSomeEvent(object sender, SomeArgs e)
{
    // I can collapse Grid2
    Grid2Visibility = Visibility.Collapsed;
    // or I can show it
    Grid2Visibility = Visibility.Visible;   
 }  

另一种选择是使用触发器。 下面是一个按钮的单击事件触发第二个按钮可见性的快速而肮脏的示例:

<StackPanel>
    <Button Content="Button 1">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference Button2}" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    <Button Name="Button2" Visibility="Collapsed">Button 2</Button>
</StackPanel>

下面是一个如何隐藏代码的简单示例。

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private Visibility _gird2Visibility;
    public Visibility Grid2Visibility
    {
        get { return _gird2Visibility; }
        set
        {
            _gird2Visibility = value;
            OnPropertyChanged("Grid2Visibility");
        }
    }
    public MainWindow()
    {
        InitializeComponent();
        Grid2Visibility = Visibility.Hidden;
    }
    private void Grid1_OnMouseDown(object sender, MouseButtonEventArgs e)
    {
       Grid2Visibility = Visibility.Visible;
    }
    private void Grid1_OnMouseUp(object sender, MouseButtonEventArgs e)
    {
        Grid2Visibility = Visibility.Hidden;
    }
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

这是 XAML

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid Grid.Row="0" Name="Grid1" MouseDown="Grid1_OnMouseDown" MouseUp="Grid1_OnMouseUp" >
        <TextBlock Text="CLICK ANYWHERE WITHIN THE GRID TO SHOW SECOND GRID" />
    </Grid>
    <Grid Grid.Row="1"  Name="Grid2" Visibility="{Binding Grid2Visibility}" >
        <TextBlock Text="I AM VISIBLE" />
    </Grid>
</Grid>

我不知道您的窗口的数据上下文。但是,这就是我在示例中的设置方式

DataContext="{Binding RelativeSource={RelativeSource Self}}"

最新更新