1 回答

TA貢獻1801條經驗 獲得超16個贊
保持 SelectedLog 更新的正確方法是為 ListView 創建一個 ItemContainerStyle 并將其綁定在那里。這是正確的解決方案。您需要使項目視圖模型成為實現 INotifyPropertyChanged 的實際視圖模型。事實上,更改該屬性永遠不會影響 UI 中的任何內容,因為 UI 不會收到更改通知。該解決方案如下。
但是,如果視圖模型并不特別關心它是否被選中,我們可以刪除您的 SelectionChanged 處理程序,從項目類中刪除 SelectedLog,然后直接綁定到觸發器中 ListViewItem 的實際 IsSelected 屬性。請注意,您將組合框設置為在選擇項目時可見,但在未選擇項目時從未隱藏它。我已經解決了這個問題。當我們被選中時,一個控件會隱藏,而當我們未被選中時,另一個控件會隱藏。
<Label Content="{Binding EmployeeName}" >
<Label.Style>
<Style TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
<ComboBox Tag="{Binding ElementName=gdEmployee, Path=Tag}" ItemsSource="{Binding EmployeeList}" SelectedValue="{Binding SelectedEmployee.EmployeeID}" DisplayMemberPath="EmployeeName" SelectedValuePath="EmployeeID" FlowDirection="LeftToRight" Margin="15,5" HorizontalAlignment="Stretch" >
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
您應該學習如何創建和綁定視圖模型屬性,這就是該解決方案。首先,我們需要創建“viewmodel”實際的視圖模型:
public class DailyServiceLogsViewModel : ViewModelBase
{
public int DailyServiceLogID { get; set; }
public int EmployeePositionID { get; set; }
public PositionType SelectedEmployeePosition { get; set; }
public List<PositionType> EmployeePositionList { get; set; }
public List<EmployeeSelectionListViewModel> EmployeeList { get; set; }
public EmployeeSelectionListViewModel SelectedEmployee { get; set; }
public string EmployeeName { get; set; }
public string PositionDescription { get; set; }
public DateTime? Date { get; set; }
public string WorkArea { get; set; }
// Only properties like this will notify the UI when they update.
private bool _isSelectedLog = false;
public bool IsSelectedLog
{
get => _isSelectedLog;
set => SetProperty(ref _isSelectedLog, value);
}
}
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
public void SetProperty<T>(ref T field, T value, [CallerMemberName] string propName = null)
{
if (!Object.Equals(field, value))
{
field = value;
OnPropertyChanged(propName);
}
}
}
其次,添加一個 ItemContainerStyle,用于在選擇項目時設置 IsSelectedLog。您可以刪除 SelectionChanged 處理程序。
<ListView ItemsSource="{Binding Items}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelectedLog}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn x:Name="clmServiceEmployeeName" Header="Employee" Width="155">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid Tag="{Binding DailyServiceLogID}">
<Label Content="{Binding EmployeeName}" >
<Label.Style>
<Style TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedLog}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
<ComboBox Tag="{Binding ElementName=gdEmployee, Path=Tag}" ItemsSource="{Binding EmployeeList}" SelectedValue="{Binding SelectedEmployee.EmployeeID}" DisplayMemberPath="EmployeeName" SelectedValuePath="EmployeeID" FlowDirection="LeftToRight" Margin="15,5" HorizontalAlignment="Stretch" >
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedLog}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
- 1 回答
- 0 關注
- 187 瀏覽
添加回答
舉報