注:改寫爲MCVE二傳手不是始終要求在DataTrigger
我已經制定了類似這樣的,其目的是爲了隱藏ListView
如果它是空的,或者顯示它並選擇第一個項目,如果它不是空的UI
<Window x:Class="BrokenSelection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BrokenSelection"
mc:Ignorable="d"
SizeToContent="WidthAndHeight"
Title="MainWindow">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<StackPanel>
<ListView x:Name="MyListView" ItemsSource="{Binding Items}">
<ListView.Style>
<Style TargetType="ListView">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
<Setter Property="SelectedIndex" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Style>
</ListView>
<Button Content="Set" Click="Button_Set"/>
<Button Content="Clear" Click="Button_Clear"/>
<Button Content="Step" Click="Button_Step"/>
</StackPanel>
</Window>
我有一個虛擬機來實現這樣的
class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private List<string> items = new List<string>();
public List<string> Items
{
get
{
return items;
}
set
{
items = value;
PropertyChanged?.DynamicInvoke(this, new PropertyChangedEventArgs("Items"));
}
}
}
我有代碼隱藏這樣
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Set(object sender, RoutedEventArgs e)
{
var l = new List<string>();
l.Add("Item1");
l.Add("Item2");
l.Add("Item3");
l.Add("Item4");
l.Add("Item5");
var vm = DataContext as ViewModel;
vm.Items = l;
}
private void Button_Clear(object sender, RoutedEventArgs e)
{
var vm = DataContext as ViewModel;
vm.Items = new List<string>();
}
private void Button_Step(object sender, RoutedEventArgs e)
{
MyListView.SelectedIndex++;
}
}
我的問題是Setter
爲SelectedIndex
成功,只要我點擊「設置」,「清」,「設置」,「清晰」等......
但是,如果我點擊「設置」 ,「步驟」,「清除」,「設置」,SelectedIndex
在第二個「集合」上結束爲-1而不是0。其他Setter
會在列表消失並正確重新顯示時執行。爲什麼在我的觸發器中手動更改SelectedIndex
會中斷setter?
嗯,我不知道。抱歉。你的問題有了很大的改進。謝謝你。我可以很容易地重現你描述的行爲。我注意到,選擇的改變並不重要,如果我甚至只是點擊列表視圖,就會中斷後續的觸發分配。我所知道的:一般來說,顯式賦值屬性會覆蓋樣式賦值(包括觸發器)。 _可能_這就是這裏發生的事情。但即使向視圖模型添加索引屬性並以這種方式間接設置列表視圖選擇索引也無法解決此問題。 –
我沒有時間更努力尋找解決方法。在你上面的例子中,你直接操作'SelectedIndex'屬性,所以我想一種選擇是在代碼隱藏的其他地方做這個。似乎有一些關於列表視圖對象的事情,一旦某些外部力量改變了屬性,觸發器就不會再這樣做了。但是我不清楚具體情況以解釋爲什麼或者解決觸發器設置問題。 –