Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 通过数据绑定更改listbox项的背景色属性_C#_Silverlight_Windows Phone 7_Xaml - Fatal编程技术网

C# 通过数据绑定更改listbox项的背景色属性

C# 通过数据绑定更改listbox项的背景色属性,c#,silverlight,windows-phone-7,xaml,C#,Silverlight,Windows Phone 7,Xaml,我试图使ListBox根据一些变化的数据更新其内容。 XAML如下所示 StackPanel Orientation="Vertical"> <ListBox x:Name="listWatch" > <ListBox.ItemTemplate> <DataTemplate> <Grid ShowGridLines="True"> <Grid Grid.

我试图使ListBox根据一些变化的数据更新其内容。 XAML如下所示

StackPanel Orientation="Vertical">
<ListBox  x:Name="listWatch"  >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid ShowGridLines="True">
                <Grid Grid.Column="0" Background="{Binding Path=Color">
                    <TextBlock  Text="{ Binding Path=LTP}"  Padding="2 2 2 2"/>
                </Grid>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<Button x:Name="btn"  Click="btn_Click" Content="Button" />
 public class WatchRow : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string _color;
    decimal _lTP;

    public WatchRow(decimal LTP,string color)
    {         
        this.LTP = LTP;          
        this.Color = color;
    }
    public string Color 
    {
        get { return _color; }
        set{
            _color = value;
            OnPropertyChanged(_color);
        }
    }       
    public decimal LTP
    {
        get { return _lTP; }
        set
        {
            _lTP = value;
            OnPropertyChanged(_lTP.ToString());
        }
    }  
    protected void OnPropertyChanged(string info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}

 public class Watch:ObservableCollection<WatchRow>
    {
        public Watch():base()
        {
        }       
    }

我的问题是,我无法通过设置btn\U单击中的颜色属性(查看[0]。color=“green”)来更改列表框项目的颜色,如代码所示。但同样的代码在PhoneApplicationPage_加载_1中工作。我不知道我错了什么。有什么想法吗?

我认为问题在于您使用PropertyChanged的方式发生了细微的变化。调用OnPropertyChanged时,传递要更改的属性的名称,而不是值。例如:

public string Color 
    {
        get { return _color; }
        set{
            _color = value;
            OnPropertyChanged(_color);
        }
    }   
应该是:

public string Color 
    {
        get { return _color; }
        set{
            _color = value;
            OnPropertyChanged("Color");
        }
    }   
另外,我不确定这是否一定是个问题,但我总是这样创建OnPropertyChanged函数:

而不是:

protected void OnPropertyChanged(string info)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(info));
    }
}
尝试:

此外,正如Magnus Johansson提到的,定义画笔并绑定颜色,而不是字符串。因此,颜色属性将是(有关这方面的更多详细信息,请参见他的解释):


使用Mvvm,您可以解决您的问题: 我已经测试了这段代码,它是有效的。您需要将代码拆分为三个单独的文件,如下所示:

视图模型

public class WatchViewModel
{
    public ObservableCollection<WatchRow> WatchRows { get; set; }

    public void GetWatchRows()
    {
        WatchRows= new ObservableCollection<WatchRow>();
    }

    public void AddWatchRow(int value, string color)
    {
        var item=new WatchRow(value, color);
        WatchRows.Add(item);
    }
}
public class WatchRow : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string _color;
    decimal _lTP;

    public WatchRow(decimal LTP, string color)
    {
        this.LTP = LTP;
        this.Color = color;
    }
    public string Color
    {
        get { return _color; }
        set
        {
            _color = value;
            OnPropertyChanged(_color);
        }
    }
    public decimal LTP
    {
        get { return _lTP; }
        set
        {
            _lTP = value;
            OnPropertyChanged(_lTP.ToString());
        }
    }
    protected void OnPropertyChanged(string info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}
和视图(xaml页面的代码隐藏)


谢谢你的回复,帮了很多忙谢谢你的回复,我一定会调查Mvvm的
private Color _color;
public Color Color 
        {
            get { return _color; }
            set{
                _color = value;
                OnPropertyChanged("Color");
            }
        }   
public class WatchViewModel
{
    public ObservableCollection<WatchRow> WatchRows { get; set; }

    public void GetWatchRows()
    {
        WatchRows= new ObservableCollection<WatchRow>();
    }

    public void AddWatchRow(int value, string color)
    {
        var item=new WatchRow(value, color);
        WatchRows.Add(item);
    }
}
public class WatchRow : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string _color;
    decimal _lTP;

    public WatchRow(decimal LTP, string color)
    {
        this.LTP = LTP;
        this.Color = color;
    }
    public string Color
    {
        get { return _color; }
        set
        {
            _color = value;
            OnPropertyChanged(_color);
        }
    }
    public decimal LTP
    {
        get { return _lTP; }
        set
        {
            _lTP = value;
            OnPropertyChanged(_lTP.ToString());
        }
    }
    protected void OnPropertyChanged(string info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}
public partial class MainPage : PhoneApplicationPage
{
    private WatchViewModel watch;

    public MainPage()
    {
        InitializeComponent();

         watch = new WatchViewModel();
        watch.GetWatchRows();


        watch.AddWatchRow(132, "green");
        watch.AddWatchRow(123, "red");
        base.DataContext = watch;
        listWatch.ItemsSource = watch.WatchRows;

    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        watch.AddWatchRow(132, "pink");
        watch.AddWatchRow(113, "yellow");

    }
}