0

変化するデータに応じてコンテンツを更新する 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()
        {
        }       
    }

そして、コードビハインドファイルは次のようになります

    Watch watch = new Watch();
private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    watch.Add(new WatchRow(132, "black"));
    watch.Add(new WatchRow(123, "red"));
    listWatch.ItemsSource = watch;  
watch[0].Color = "green";
}

private void btn_Click(object sender, RoutedEventArgs e)
{

    watch[0].Color = "green";
}

私の問題は、コードに示されているように btn_Click でcolor プロパティ ( watch[0].Color = "green"; ) を設定して、リスト ボックス項目の色を変更できないことです。ただし、PhoneApplicationPage_Loaded_1 でも同じコードが機能します。何が間違っているのかわかりません。何か案は?

4

2 に答える 2

0

問題は、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));
    }
}

試す:

private void OnPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

また、Magnus Johansson が述べたように、ブラシを定義し、文字列ではなく Color をバインドします。したがって、Color プロパティは次のようになります (詳細については、彼の説明を参照してください)。

private Color _color;
public Color Color 
        {
            get { return _color; }
            set{
                _color = value;
                OnPropertyChanged("Color");
            }
        }   
于 2012-06-01T15:20:59.420 に答える
0

Mvvm を使用すると、問題を解決できます。このコードをテストしたところ、動作します。次のように、コードを 3 つの個別のファイルに分割する必要があります。

ビューモデル

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 ページの背後にあるコード)

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");

    }
}
于 2012-06-01T15:44:01.123 に答える