4

我制作了一个程序来存储我的项目类型的任意数量的对象。然后每个项目包含任意数量的文件,这是我为这个程序创建的另一个对象。

我遇到的问题出现在 XAML 中,在 2 个领域,但我想这有相似的起源。

我有一个包含 ListView 的窗口,其中填充了所选项目中的文件。从这里我可以选中每个旁边的框以打开或关闭它们,如果我选择一个文件,有关它的信息将显示在此窗口的状态栏中。

如果我关闭一个文件,它的文本颜色应该在 ListView 中显示为浅灰色,但它不会自动执行此操作;我必须关闭窗口并重新打开它。File 实现 INotifyPropertyChanged,并在开/关状态发生变化时触发此事件。

我使用这个 XAML 代码,转换器在我的代码后面的类中:

<ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
          <Setter  Property="Foreground" Value="{Binding Path=IsVisible, Converter={StaticResource VisibleStateToFontColourConverter}}"/>
     </Style>
</ListBox.ItemContainerStyle>  

同样对于所选文件,如果文件中的信息在选择时发生更改(其他类可能导致发生),我希望状态栏自动更新以反映此更改,但事实并非如此;我必须单击其他内容,然后重新选择感兴趣的文件。我也为此实现和使用 INotifyPropertyChanged,所以我不知道为什么它不会自动更新。我的状态项的 XAML 代码是这样的:

<StatusBarItem Name="statusItem_FileInfo" Content="{Binding ElementName=loadedFiles_ListView, Path=SelectedItem, Converter={StaticResource GIS_FileToInfoConverter}}"/>

有谁知道我缺少什么可以将它们结合在一起?

4

2 回答 2

8

尝试添加UpdateSourceTrigger=PropertyChanged到您的绑定:

Value = "{Binding ... , UpdateSourceTrigger=PropertyChanged}"

OnPropertyChanged使用更改后的属性名称更改属性后直接调用:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler == null) return;
    handler (this, new PropertyChangedEventArgs(propertyName));
}

如果您更改"IsVisible"通话OnPropertyChanged("IsVisible")

于 2012-05-22T12:53:21.497 回答
0

为什么不为列表框项使用数据触发器?如果我说得对,您只想在两种状态之间切换?

所以默认样式应该是 foreground=black 和 datatrigger Property=IsVisible Value=false --> 然后前景 lightgrey

于 2012-05-22T13:22:17.287 回答