初次接觸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屬性綁定清單屬性,背景根據自己的邏輯修改對應的枚舉值即可
下面是我定義的屬性
最後再上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>
我認為還是第二種方式比較科學,希望還有辦法的大佬可以補充一下哈哈