2

xaml コード:

<ControlTemplate x:Key="ChkTemplate"
                         TargetType="ListViewItem">
            <StackPanel Orientation="Horizontal">                    
                <CheckBox Margin="0,0,3,0">
                    <CheckBox.IsChecked>
                        <Binding Path="IsSelected"
                                 Mode="TwoWay">
                            <Binding.RelativeSource>
                                <RelativeSource Mode="TemplatedParent" />
                            </Binding.RelativeSource>
                        </Binding>                                
                    </CheckBox.IsChecked>
                </CheckBox>                    
                <ContentPresenter />                    
            </StackPanel>
        </ControlTemplate>                    
<DataTemplate DataType="{x:Type ABC:Info}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding}"
          Margin="0,0,10,5" Foreground="Green"/>
        <TextBlock Text="{Binding Channel}"
           Margin="3,0,0,0"
           Visibility="{Binding Path=Visible,ElementName=View, Converter={StaticResource BooleanConverter}}" />
        <TextBlock.Foreground>
            <SolidColorBrush Color="{Binding Foreground}" />
        </TextBlock.Foreground>                   
    </StackPanel>
</DataTemplate>   
<Style TargetType="ListViewItem"
               x:Key="SelectedItem">
            <Setter Property="Template"
                    Value="{StaticResource ChkTemplate}" />
</Style> 

クラス:

public class Info : DependencyObject
    {      
           public Brush Foreground
        {
            get { return (Brush)GetValue(ForegroundProperty); }
            set { SetValue(ForegroundProperty, value); }
        }
    }

xaml.cs:

private readonly RangeObservableCollection<Info> _validInfo;

Info.Foreground = Brushes.Red;                                        
_validInfo.Add(Info);

上記のコードは、テキストブロックの前景色を変更していません。何が間違っていますか?

4

2 に答える 2

1

私はあなたのコードを試してみましたが、うまくいきました。データテンプレートが動作するコードを投稿できますか? 私はリストボックスでそれを行います。

編集

public partial class MainWindow : Window
{
    private ObservableCollection<Info> _source;
    public MainWindow()
    {
        this.MySource = new ObservableCollection<Info>();
        InitializeComponent();
        this.DataContext = this;


        this.MySource.Add(new Info(){Foreground = Brushes.Red});
    }

    public ObservableCollection<Info> MySource
    {
        get { return _source; }
        set { _source = value; }
    }
}

public class Info : DependencyObject
{

    public static readonly DependencyProperty ForegroundProperty = DependencyProperty.Register("Foreground", typeof(Brush), typeof(Info));

    public Brush Foreground
    {
        get { return (Brush)GetValue(ForegroundProperty); }
        set { SetValue(ForegroundProperty, value); }
    }

}

xaml

<Grid>
    <Grid.Resources>
        <DataTemplate DataType="{x:Type TestForeground:Info}">
            <TextBlock Text="{Binding}" Foreground="{Binding Foreground}"/>
        </DataTemplate>
    </Grid.Resources>
    <ListBox ItemsSource="{Binding MySource}">

    </ListBox>
</Grid>
于 2012-11-29T07:35:45.613 に答える
0

まず、今後の質問に備えて、「完全な」例を必ず提供します。貼り付けたコードを実行するには、少し手を加える必要があります。

とはいえ、問題を引き起こす可能性のあるタイプミスがいくつかあります。次のわずかにクリーンアップされたコードが適切にバインドされます。

XAML:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WpfApplication1="clr-namespace:WpfApplication1" 
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanConverter"/>
        <ControlTemplate x:Key="ChkTemplate"
                         TargetType="ListViewItem">
            <StackPanel Orientation="Horizontal">
                <CheckBox Margin="0,0,3,0" 
                                IsChecked="{TemplateBinding IsSelected}"/>
                <ContentPresenter />
            </StackPanel>
        </ControlTemplate>
        <DataTemplate DataType="{x:Type WpfApplication1:Info}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" 
                                Margin="0,0,10,5" 
                                Foreground="Green"/>
                <TextBlock 
                    Text="{Binding Channel}" 
                    Margin="3,0,0,0" 
                    Visibility="{Binding Path=Visible, Converter={StaticResource BooleanConverter}}"
                    Foreground="{Binding Foreground}"/>
            </StackPanel>
        </DataTemplate>
        <Style TargetType="ListViewItem" x:Key="{x:Type ListViewItem}">
            <Setter Property="Template" Value="{StaticResource ChkTemplate}" />
        </Style>
    </Window.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Infos}">
        </ListView>
    </Grid>
</Window>

コード:

namespace WpfApplication1
{
    using System.Collections.ObjectModel;

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private readonly ObservableCollection<Info> _validInfo;

        public Window1()
        {
            _validInfo = new ObservableCollection<Info>();
            InitializeComponent();
            this.DataContext = this;
            var info = new Info();
            info.Foreground = Brushes.Red;
            info.Visible = true;
            info.Channel = "not sure";
            _validInfo.Add(info);
            info = new Info();
            info.Foreground = Brushes.Blue;
            info.Visible = true;
            info.Channel = "also not sure";
            _validInfo.Add(info);

        }

        public ObservableCollection<Info> Infos { get { return _validInfo; } }
    }

    public class Info : DependencyObject
    {
        public Brush Foreground
        {
            get { return (Brush)GetValue(TextBlock.ForegroundProperty); }
            set { SetValue(TextBlock.ForegroundProperty, value); }
        }

        public bool Visible { get; set; }
        public string Channel { get; set; }

        public override string ToString()
        {
            return string.Format("{0}-{1}-{2}", Channel, Foreground, Visible);
        }
    }
}
于 2012-12-07T21:45:48.580 に答える