如何从Windows Phone上的代码更改DataTemplate中TextBlock的前景色?

时间:2012-02-26 15:37:41

标签: windows-phone-7

我想从代码中更改DataTemplate中TextBlock的前景颜色(下面是TitleText和DateText)。

<ListBox x:Name="listBox1" ItemsSource="{Binding}" ScrollViewer.ManipulationMode="Control" SelectionChanged="listBox1_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel x:Name="stackPanel1" HorizontalAlignment="Stretch" Orientation="Horizontal">
                <TextBlock FontSize="35" x:Name="TitleText" Text="{Binding Title}" Width="386" Foreground="Black" />
                <TextBlock FontSize="25" x:Name="DateText" Text="{Binding Date}" Width="78" Foreground="Black" />
                <TextBlock x:Name="Id" Text="{Binding Id}" Visibility="Collapsed" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我想在后面的代码中这样做。但它似乎无法访问DataTemplate中的x:Name属性。

this.TitleText.Foreground = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0);

有没有人知道这个问题的好方法?

4 个答案:

答案 0 :(得分:6)

为什么不用快速方式而不是抓取可视树。

<TextBlock FontSize="35" Text="{Binding Title}" Width="386" Foreground="[Binding Color}" />

然后你所要做的就是:

  1. 在您的收藏中添加Color画笔属性
  2. 将此属性更改为您想要的颜色
  3. 确保此属性实现INotify或是依赖属性
  4. 实施例

    XAML

    <Grid>
        <ListBox ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal">
                        <TextBlock Text="{Binding Title}" Foreground="{Binding TitleColor}" />
                        <TextBlock Text="{Binding Date}" Foreground="Black" />
                        <TextBlock Text="{Binding Id}" Visibility="Collapsed" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
    

    代码隐藏

    public partial class MainPage : Page
    {
        public ObservableCollection<TEST> TestCollection { get; private set; }
    
        public MainWindow()
        {
            InitializeComponent();
    
            TestCollection = new ObservableCollection<TEST>();
            TestCollection.Add(new TEST()
            {
                TitleColor = Brushes.Black,
                ID = 0,
                Title = "A",
                Date = DateTime.Now,
            });
    
            TestCollection.Add(new TEST()
            {
                TitleColor = Brushes.Red,
                ID = 1,
                Title = "B",
                Date = DateTime.Now.AddDays(1),
            });
    
            DataContext = TestCollection;
        }
    }
    
    public class TEST : INotifyPropertyChanged
    {
        private Brush _TitleColor;
        public Brush TitleColor
        {
            get
            {
                return _TitleColor;
            }
    
            set
            {
                _TitleColor = value;
                OnPropertyChanged("TitleColor");
            }
        }
    
        private int _ID;
        public int ID
        {
            get
            {
                return _ID;
            }
    
            set
            {
                _ID = value;
                OnPropertyChanged("ID");
            }
        }
    
        private string _Title;
        public string Title
        {
            get
            {
                return _Title;
            }
    
            set
            {
                _Title = value;
                OnPropertyChanged("Title");
            }
        }
    
        private DateTime _Date;
        public DateTime Date
        {
            get
            {
                return _Date;
            }
    
            set
            {
                _Date = value;
                OnPropertyChanged("Date");
            }
        }
    
        public TEST()
        {
        }
    
        #region INotifyProperty
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
        #endregion
    }
    

答案 1 :(得分:1)

您可以使用FindItem方法按名称查找可视树中的元素,然后将其更改为Foregorund

((listBox.ItemContainerGenerator.ContainerFromIndex(5) as FrameworkElement).FindName("TitleText") as TextBlock).Foreground = new SolidColorBrush(Color.FromArgb(255, 128, 128, 128));

其中5是您的项目索引

答案 2 :(得分:0)

要扩展MyKuLLSKI的答案,如果您的更改基于对象中已有的某些值(例如,大于5的int属性),则可以使用ValueConverter(see here for an example)来读取值并返回画笔。这比为模型添加颜色更清晰,因为它(可以说)与UI相关而不是与数据相关。

答案 3 :(得分:-1)

MyKuLLSKI给了我完美的解决方案。但我无法做到。

我在挣扎,我发现了自己的问题。我在博客中写了答案(仅限我)。请一目了然。

无法将两种类型的数据源绑定到一个UI目标 http://myprogrammingdial.blogspot.com/2012/03/cannot-bind-two-types-of-data-source-to.html