天天看點

WPF中listview動态控制按鈕顯示

初次接觸WPF記錄一下這個麻煩了我比較久的問題,哈哈

先上xaml代碼

<ListView  x:Name="ListView1" Grid.Row="1" Grid.Column="1" Grid.IsSharedSizeScope="True" ItemsSource="{Binding SingelDrivewayProbs}" ItemContainerStyle="{StaticResource YKListViewItem}" Margin="10,0,0,0">
            <ListView.View>
                <GridView x:Name="probList">
                    <GridViewColumn Header="問題描述" Width="200" DisplayMemberBinding="{Binding ProbDesc}"/>
                    <GridViewColumn Header="操作" Width="150">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Margin="0 -7">
                                    <Button Visibility="{Binding pdBtn_Visible}" Name="pdBtn" Content="派單" Style="{StaticResource MaterialDesignFlatButton}" />
                                    <Button Visibility="{Binding jkBtn_Visible}" Name="jkBtn" Content="檢視監控" Style="{StaticResource MaterialDesignFlatButton}"/>
                                    <Button Visibility="{Binding cqBtn_Visible}" Name="cqBtn" Content="重新開機" Style="{StaticResource MaterialDesignFlatButton}"/>
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
           

給Visibility屬性綁定清單屬性,背景根據自己的邏輯修改對應的枚舉值即可

下面是我定義的屬性

WPF中listview動态控制按鈕顯示

最後再上vm對應的代碼:

對接口傳回的資料根據自己業務邏輯判斷

foreach (var item in expApiResult.Result.Data)
                    {
                        var it = new DrivewayProbItem
                        { 
                            DrivewayId = item.CrossingId, 
                            ProbDesc = item.DeviceDescribe,
                            cqBtn_Visible = item.DeviceDescribe.Contains("地感異常") || item.DeviceDescribe.Contains("一體機") ? Visibility.Visible : Visibility.Collapsed,
                            jkBtn_Visible = item.DeviceDescribe.Contains("地感異常") ? Visibility.Visible : Visibility.Collapsed,
                            pdBtn_Visible = item.DeviceDescribe.Contains("資料同步") ? Visibility.Visible : Visibility.Collapsed ,
                        };
                        //将問題明細寫入單獨的集合存放
                        if (Probs.Where(s=>s.DrivewayId == item.CrossingId && s.ProbDesc == item.DeviceDescribe).ToList().Count == 0)
                        {
                            Probs.Add(it);
                        }
                        //将相同道口id的異常資訊合并:
                        //如果集合已經存在了這道口資訊,則直接添加異常資訊,否則新增一條資料
                        var device = list.Find(x => x.CrossingId == item.CrossingId);
                        if (list.FindAll(s=>s.CrossingId == item.CrossingId).Count() > 0 && device != null)
                        {
                            device.DeviceName += ","+item.DeviceName;
                        }
                        else
                        {
                            list.Add(item);
                        }
                    }
           

加更一下,還有一種辦法哈哈哈

1、通過給樣式添加觸發器,綁定條件值

<Style x:Key="SyncButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatMidBgButton}">
            <Setter Property="Margin" Value="0 -8" />
            <Setter Property="Padding" Value="8" />
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding DeviceName}" Value="資料同步" />
                        <Condition Binding="{Binding DeviceState}" Value="WARNING" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Visibility" Value="Visible" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
           

2、引用樣式即可

<ListView ItemsSource="{Binding Source}" Grid.IsSharedSizeScope="True" ItemContainerStyle="{StaticResource YKListViewItem}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="物業" DisplayMemberBinding="{Binding PropertyName}"/>
                    <GridViewColumn Header="小區" DisplayMemberBinding="{Binding CommunityName}"/>
                    <GridViewColumn Header="停車場" DisplayMemberBinding="{Binding ParkName}"/>
                    <GridViewColumn Header="道口" DisplayMemberBinding="{Binding CrossingAlias}"/>
                    <GridViewColumn Header="裝置" DisplayMemberBinding="{Binding DeviceName}"/>
                    <GridViewColumn Header="狀态" DisplayMemberBinding="{Binding DeviceState}"/>
                    <GridViewColumn Header="說明" DisplayMemberBinding="{Binding DeviceDescribe}"/>
                    <GridViewColumn Header="操作" CellTemplate="{StaticResource OperationCellTemplate}" />
                </GridView>
            </ListView.View>
        </ListView>
           

我認為還是第二種方式比較科學,希望還有辦法的大佬可以補充一下哈哈