我制作了一个程序,用于存储我的类型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}}"/>
有谁知道我错过了哪些会把它们全部组合在一起?
答案 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;前景光线