Wpf ListViewItem未使用绑定的IValueConverter更改前景色
我的问题是,我希望我的WPF ListView根据绑定到ListViewItems的项目以不同的颜色显示ListViewItems。下面是重新设置问题的所有代码。该应用程序具有“库存”或“非库存”的小部件。如果它们有库存,则ListView中应有绿色文本,否则为红色文本。颜色由我的BoolToColorConverter处理(将Widget.InStock转换为Colors.Green或Colors.Red)。断点确保正在命中Convert()。我可能做了一些明显错误的事情,但我不知所措,因为硬编码的前景颜色工作的预期。提前谢谢 main window.xamlWpf ListViewItem未使用绑定的IValueConverter更改前景色,wpf,listview,listviewitem,ivalueconverter,Wpf,Listview,Listviewitem,Ivalueconverter,我的问题是,我希望我的WPF ListView根据绑定到ListViewItems的项目以不同的颜色显示ListViewItems。下面是重新设置问题的所有代码。该应用程序具有“库存”或“非库存”的小部件。如果它们有库存,则ListView中应有绿色文本,否则为红色文本。颜色由我的BoolToColorConverter处理(将Widget.InStock转换为Colors.Green或Colors.Red)。断点确保正在命中Convert()。我可能做了一些明显错误的事情,但我不知所措,因为硬
<Window x:Class="ListViewItemColors.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ListViewItemColors" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:WidgetsViewModel />
</Window.DataContext>
<Window.Resources>
<local:BoolToColorConverter x:Key="BoolToColor" />
</Window.Resources>
<DockPanel >
<ListView ItemsSource="{Binding Path=Widgets }">
<ListView.View>
<GridView>
<GridViewColumn Width="150" Header="Widget Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}" Foreground="{Binding Path=InStock, Converter={StaticResource BoolToColor}}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="50" Header="Size" DisplayMemberBinding="{Binding Size}"></GridViewColumn>
<GridViewColumn Width="75" Header="In Stock?" DisplayMemberBinding="{Binding InStock}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
WidgetsViewModel.cs
public class BoolToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (bool)value;
return val ? Colors.Green : Colors.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class WidgetsViewModel
{
public WidgetsViewModel()
{
Widgets = new Widgets
{
new Widget {InStock = true, Name = "Flipper", Size = 10},
new Widget {InStock = false, Name = "Gizmo", Size = 6},
new Widget {InStock = true, Name = "Gizmo", Size = 8},
new Widget {InStock = true, Name = "Whirlygig", Size = 15},
new Widget {InStock = false, Name = "Gutter", Size = 1},
new Widget {InStock = false, Name = "Gutter", Size = 2}
};
}
public Widgets Widgets { get; set; }
}
public class Widget : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged("Name");
}
}
private int _size;
public int Size
{
get { return _size; }
set
{
if (_size == value) return;
_size = value;
OnPropertyChanged("Size");
}
}
private bool _inStock;
public bool InStock
{
get { return _inStock; }
set
{
if (_inStock == value) return;
_inStock = value;
OnPropertyChanged("InStock");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
public class Widgets : ObservableCollection<Widget> { }
Widget.cs
public class BoolToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (bool)value;
return val ? Colors.Green : Colors.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class WidgetsViewModel
{
public WidgetsViewModel()
{
Widgets = new Widgets
{
new Widget {InStock = true, Name = "Flipper", Size = 10},
new Widget {InStock = false, Name = "Gizmo", Size = 6},
new Widget {InStock = true, Name = "Gizmo", Size = 8},
new Widget {InStock = true, Name = "Whirlygig", Size = 15},
new Widget {InStock = false, Name = "Gutter", Size = 1},
new Widget {InStock = false, Name = "Gutter", Size = 2}
};
}
public Widgets Widgets { get; set; }
}
public class Widget : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged("Name");
}
}
private int _size;
public int Size
{
get { return _size; }
set
{
if (_size == value) return;
_size = value;
OnPropertyChanged("Size");
}
}
private bool _inStock;
public bool InStock
{
get { return _inStock; }
set
{
if (_inStock == value) return;
_inStock = value;
OnPropertyChanged("InStock");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
public class Widgets : ObservableCollection<Widget> { }
Widgets.cs
public class BoolToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (bool)value;
return val ? Colors.Green : Colors.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class WidgetsViewModel
{
public WidgetsViewModel()
{
Widgets = new Widgets
{
new Widget {InStock = true, Name = "Flipper", Size = 10},
new Widget {InStock = false, Name = "Gizmo", Size = 6},
new Widget {InStock = true, Name = "Gizmo", Size = 8},
new Widget {InStock = true, Name = "Whirlygig", Size = 15},
new Widget {InStock = false, Name = "Gutter", Size = 1},
new Widget {InStock = false, Name = "Gutter", Size = 2}
};
}
public Widgets Widgets { get; set; }
}
public class Widget : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged("Name");
}
}
private int _size;
public int Size
{
get { return _size; }
set
{
if (_size == value) return;
_size = value;
OnPropertyChanged("Size");
}
}
private bool _inStock;
public bool InStock
{
get { return _inStock; }
set
{
if (_inStock == value) return;
_inStock = value;
OnPropertyChanged("InStock");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
public class Widgets : ObservableCollection<Widget> { }
公共类小部件:ObservableCollection{}
属性使用的是笔刷,而不是颜色。更改转换器,使其返回SolidColorBrush
,例如:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (bool)value;
return new SolidColorBrush(val ? Colors.Green : Colors.Red);
}
这对我很有用:
enter code here
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Foreground"
Value="{Binding FColor,Mode=OneWay,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ColorConverter}}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Category"
DisplayMemberBinding="{Binding CatDesc,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
Width="450"/>
</GridView>
</ListView.View>
在此处输入代码
是否可以检查与任何绑定错误相对应的输出窗口?Listview的颜色很奇怪。你穿什么颜色的?黑色、绿色还是红色?@PK:Nada。同时在所有CLR异常上启用“中断”。如果你不想从这里复制/粘贴,我会给SLN发电子邮件。@Rachel:black!这可能很有趣,因为其他项目是深蓝色的。+1忽略了这一点。这肯定会在VS@P.K的输出窗口中出现绑定表达式错误。我正在查看输出窗口,Debug stuff。没有什么。我不确定你是否能从这一片中看到足够的东西来相信我。已加载“C:\Windows\assemb已加载”C:\Windows\assemb已加载“C:\Windows\assemb已加载”C:\Windows\assemb已加载“C:\Windows\assemb已加载”C:\Windows\assemb已加载“D:\Project\Junk\Loaded”C:\Windows\assemb已加载“C:\Windows\assemb已加载”C:\Windows\assemb已加载“C:\Windows\assemb已加载”C:\Windows\assemb代码0(0x0). 0x0)。0x0)。th代码0(0x0)。加载的'D:\Projects\Junk\Loaded'C:\Windows\assemb rs.App.App'rs.App.InitializeComponen加载