XAML数据绑定——UI未自动更新

5
我创建了一个程序,可以存储任意数量的“Project”类型对象。每个“Project”包含任意数量的“Files”,这是我为该程序创建的另一个对象。
我的问题出现在XAML中的两个区域,但我想它们有相似的起源。
我有一个窗口,其中包含一个ListView,其中填充了所选项目中的文件。从这里,我可以在每个文件旁边勾选框以打开或关闭它们,如果我选择一个文件,则此窗口的状态栏中会显示有关它的信息。
如果我关闭一个文件,则其文本颜色应该在ListView中显示为浅灰色,但它不会自动执行此操作;我必须关闭窗口并重新打开它。该文件实现了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}}"/>

有没有人知道我缺了什么才能让它完美呢?


(这段文字与IT技术无关。)

展示你的ListBox的ItemsSource,展示你的IsVisible属性的代码,以及展示打开/关闭复选框的代码。 - blindmeis
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")

我实际上已经尝试过了,但是没有成功。还是谢谢你。 - Greg
我的属性更改代码使用了你在这里使用的相同模板。我有一个名为IsVisible的属性,在其中Set部分调用OnPropertyChanged("VisibleState")。 - Greg
正如我在答案中所写的,当您绑定属性“IsVisible”时,您必须使用该属性的名称调用属性更改事件。 - webber2k6
当您的属性为“IsVisible”时,您必须调用OnPropertyChanged(“IsVisible”),而不是OnPropertyChanged(“VisibleState”)。 - blindmeis

0
为什么不在你的列表框项中使用数据触发器?如果我理解正确,你只是想在两个状态之间切换?
因此,默认样式应该是foreground=black和datatrigger Property=IsVisible Value=false --> 然后foreground lightgrey。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接