Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
Wpf ListViewItem未使用绑定的IValueConverter更改前景色_Wpf_Listview_Listviewitem_Ivalueconverter - Fatal编程技术网

Wpf ListViewItem未使用绑定的IValueConverter更改前景色

Wpf ListViewItem未使用绑定的IValueConverter更改前景色,wpf,listview,listviewitem,ivalueconverter,Wpf,Listview,Listviewitem,Ivalueconverter,我的问题是,我希望我的WPF ListView根据绑定到ListViewItems的项目以不同的颜色显示ListViewItems。下面是重新设置问题的所有代码。该应用程序具有“库存”或“非库存”的小部件。如果它们有库存,则ListView中应有绿色文本,否则为红色文本。颜色由我的BoolToColorConverter处理(将Widget.InStock转换为Colors.Green或Colors.Red)。断点确保正在命中Convert()。我可能做了一些明显错误的事情,但我不知所措,因为硬

我的问题是,我希望我的WPF ListView根据绑定到ListViewItems的项目以不同的颜色显示ListViewItems。下面是重新设置问题的所有代码。该应用程序具有“库存”或“非库存”的小部件。如果它们有库存,则ListView中应有绿色文本,否则为红色文本。颜色由我的BoolToColorConverter处理(将Widget.InStock转换为Colors.Green或Colors.Red)。断点确保正在命中Convert()。我可能做了一些明显错误的事情,但我不知所措,因为硬编码的前景颜色工作的预期。提前谢谢

main window.xaml

<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加载