locked
listbox中关于模板的IValueConverter更新问题 RRS feed

  • 问题

  •  Hi:

         我使用IValueConverter和模板实现listbox显示数据,但是有时因为一些用户操作,我改变了listItem的属性值,这样就会导致一些界面字体颜色的变化,而字体的颜色我是通过IValueConverter绑定实现的,请问怎么能通知listbox重新加载、或者刷新界面呢?

        public class SubjectReadStatus : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if ( null == value || false == (bool)value)
                    return "#5b5f60";
                else
                    return "#8a8a8a";
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

    2012年5月16日 9:19

答案

  • 据你所讲,是当你改变属性后,而通过你的代码可以发现这个属性是bool类型的.

    我下面写了一个例子希望可以帮到您:

    <UserControl x:Class="SilverlightApplication3.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:local="clr-namespace:SilverlightApplication3"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
        <UserControl.Resources>
            <local:SubjectReadStatus x:Key="colorConverter" />
        </UserControl.Resources>
            <Grid x:Name="LayoutRoot" Background="White">
            <ListBox Height="204" HorizontalAlignment="Left" Margin="10,10,0,0" Name="listBox1" VerticalAlignment="Top" Width="212">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Foreground="{Binding IsTrue,Converter={StaticResource colorConverter}}" Text="Text"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,229,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        </Grid>
    </UserControl>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Data;
    using System.ComponentModel;
    
    namespace SilverlightApplication3
    {
        public partial class MainPage : UserControl
        {
            List<DemoClass> dc = new List<DemoClass>();
            public MainPage()
            {
                InitializeComponent();
                dc.Add(new DemoClass(){ IsTrue=true});
                dc.Add(new DemoClass(){ IsTrue=false});
                dc.Add(new DemoClass(){ IsTrue=true});
                dc.Add(new DemoClass(){ IsTrue=false});
                listBox1.ItemsSource = dc;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                if (dc.First().IsTrue)
                    dc.First().IsTrue = false;
                else
                    dc.First().IsTrue = true;
            }
        }
        public class SubjectReadStatus : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if ( null == value || false == (bool)value)
                    return "#5b5f60";
                else
                    return "#8a8a8a";
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }
        public class DemoClass : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
            private bool isTrueValue;
            public bool IsTrue
            {
                get { return this.isTrueValue; }
    
                set
                {
                    if (value != this.isTrueValue)
                    {
                        this.isTrueValue = value;
                        NotifyPropertyChanged("IsTrue");
                    }
                }
            }
        }
    }
    

    你可以尝试按按钮你会发现内容在改变,必须是Bool类型的改变,颜色才会改变.

    • 已标记为答案 Otomii Lu 2012年5月30日 1:14
    2012年5月17日 9:24

全部回复

  • 实现属性更改通知接口不就可以了么?

    不清楚你是不是这意思哈~


    2012年5月16日 9:45
  • 我同意MagicBoy的观点,

    让你被绑定的Entity实现INotifyPropertyChanged接口即可:

    具体可以参照:http://msdn.microsoft.com/en-us/library/ms229614.aspx

    2012年5月17日 2:08
  • 我对listbox的绑定对象Model实现了INotifyPropertyChanged 接口,但是修改Model的值,界面没有变化呀,

    我是希望,我修改过Model的属性值后,能走public class SubjectReadStatus : IValueConverter 配置页面


    2012年5月17日 6:02
  • 你好,可以提供更多的代码么,我希望可以在我这里测试下.

    我想了解你是如何绑定Model的,提供listbox的xaml代码将会很有帮助


    2012年5月17日 6:41
  • 据你所讲,是当你改变属性后,而通过你的代码可以发现这个属性是bool类型的.

    我下面写了一个例子希望可以帮到您:

    <UserControl x:Class="SilverlightApplication3.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:local="clr-namespace:SilverlightApplication3"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
        <UserControl.Resources>
            <local:SubjectReadStatus x:Key="colorConverter" />
        </UserControl.Resources>
            <Grid x:Name="LayoutRoot" Background="White">
            <ListBox Height="204" HorizontalAlignment="Left" Margin="10,10,0,0" Name="listBox1" VerticalAlignment="Top" Width="212">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Foreground="{Binding IsTrue,Converter={StaticResource colorConverter}}" Text="Text"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,229,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        </Grid>
    </UserControl>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Data;
    using System.ComponentModel;
    
    namespace SilverlightApplication3
    {
        public partial class MainPage : UserControl
        {
            List<DemoClass> dc = new List<DemoClass>();
            public MainPage()
            {
                InitializeComponent();
                dc.Add(new DemoClass(){ IsTrue=true});
                dc.Add(new DemoClass(){ IsTrue=false});
                dc.Add(new DemoClass(){ IsTrue=true});
                dc.Add(new DemoClass(){ IsTrue=false});
                listBox1.ItemsSource = dc;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                if (dc.First().IsTrue)
                    dc.First().IsTrue = false;
                else
                    dc.First().IsTrue = true;
            }
        }
        public class SubjectReadStatus : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if ( null == value || false == (bool)value)
                    return "#5b5f60";
                else
                    return "#8a8a8a";
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return value;
            }
        }
        public class DemoClass : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
            private bool isTrueValue;
            public bool IsTrue
            {
                get { return this.isTrueValue; }
    
                set
                {
                    if (value != this.isTrueValue)
                    {
                        this.isTrueValue = value;
                        NotifyPropertyChanged("IsTrue");
                    }
                }
            }
        }
    }
    

    你可以尝试按按钮你会发现内容在改变,必须是Bool类型的改变,颜色才会改变.

    • 已标记为答案 Otomii Lu 2012年5月30日 1:14
    2012年5月17日 9:24