Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XAML数据绑定-UI未自动更新_C#_.net_Wpf_Xaml - Fatal编程技术网

C# XAML数据绑定-UI未自动更新

C# XAML数据绑定-UI未自动更新,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我制作了一个程序,可以存储任意数量的我的项目类型的对象。然后每个项目都包含任意数量的文件,这是我为这个程序创建的另一个对象 我遇到的问题出现在XAML中,有两个方面,但我认为它们有相似的起源 我有一个包含ListView的窗口,其中填充了选定项目中的文件。从这里,我可以选中每个文件旁边的一个框来打开或关闭它们,如果我选择了一个文件,有关它的信息将显示在此窗口的状态栏中 如果我关闭一个文件,它的文本颜色应该在ListView中显示为浅灰色,但它不会自动这样做;我得把窗户关上再打开。该文件实现INo

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

我遇到的问题出现在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}}"/>


有人知道我遗漏了什么吗?可以将其全部整合起来吗?

尝试将
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”)
为什么不为列表框项目使用数据触发器?如果我没弄错的话,你只想在两个州之间切换


所以默认样式应该是前台=黑色,datatrigger属性=IsVisible Value=false-->然后是前台浅灰色

我实际上已经尝试过了,但没有成功。谢谢。我的属性更改代码使用的模板与您在此处使用的模板相同。我有一个名为IsVisible的属性,其中Set部分调用OnPropertyChanged(“VisibleState”)。正如我在回答中所写的,当绑定属性
“IsVisible”
时,必须使用该属性的名称调用属性更改事件。当属性为“IsVisible”时,必须调用OnPropertyChanged(“IsVisible”)和非OnPropertyChanged(“VisibleState”)显示列表框的项目来源,显示IsVisible属性的代码,并显示打开/关闭的复选框代码