XAML数据绑定 - UI不自动更新

时间:2012-05-22 12:47:58

标签: c# .net wpf xaml

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

我遇到的问题出现在XAML中,有两个方面,但我认为它有相似之处。

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

如果我关闭文件,其文本颜色应该在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}}"/>

有谁知道我错过了哪些会把它们全部组合在一起?

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

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

因此默认样式应为foreground = black和datatrigger Property = IsVisible Value = false - &gt;前景光线