0

ListBoxアイテムに画像を追加したい。

私は2つの画像を持っています。1つはUpArrowで、もう1つはDownArrowです。

ItemTemplateを使用してUpArrowなどの初期画像を割り当て、それに画像を追加することができます

しかし、並べ替えボタンをクリックして、画像を変更したいと思います。新しい画像は設定されていますが、UIで変更されていません。

私のウィンドウコードは以下の通りです

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="Auto" Width="Auto" Loaded="Window_Loaded">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid Height="Auto" Width="Auto">
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <ListBox x:Name="lstBox" ItemsSource="{Binding ListIconDataCollection}" Grid.Row="0" Height="200" Width="200">
        <ListBox.ItemTemplate>
            <DataTemplate DataType="{x:Type local:ListIconData}">
                <Grid Width="Auto" Height="Auto" Background="Transparent" >
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="150"></ColumnDefinition>
                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" Text="{Binding DisplayText}"/>
                    <Image  Grid.Row="0" Grid.Column="1" Source="{Binding Path=ImageSource}" Width="20" HorizontalAlignment="Right"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Name="btnSort" Grid.Row="1" Height="40" Margin="0,15,0,0" Content="Sort" Click="btnSort_Click"></Button>

</Grid>

私のフォームコードは以下の通りです

private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        lstDataToSet.Add(new ListIconData { DisplayText = "Milind", ItemSortDirection = SortDirection.None, ImageSource = (ImageSource)FindResource("ImgUp") });
        lstDataToSet.Add(new ListIconData { DisplayText = "Patil", ItemSortDirection = SortDirection.None });

        lstBox.ItemsSource = ListIconDataCollection;
    }

これは実行されるフォームコードですが、UIで画像が変更されていません

private void btnSort_Click(object sender, RoutedEventArgs e)
    {
        ListIconData objSelectedItem = (ListIconData)lstBox.SelectedItem;
        if (objSelectedItem.ItemSortDirection==SortDirection.None)
        {
            objSelectedItem.ImageSource = null;
            objSelectedItem.ImageSource = (ImageSource)FindResource("ImgDown");

        }

    }

これはDictionary1リソースファイルコードです

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ImageSource x:Key="ImgUp">icons/Up.ico</ImageSource>
<ImageSource x:Key="ImgDown">icons/Down.ico</ImageSource>

以下はListIconDataClassです。これは私がリストボックスにバインドしているリストです

public class ListIconData
{
    public string DisplayText { get; set; }
    public SortDirection ItemSortDirection { get; set; }
    public ImageSource ImageSource { get; set; }
}

}

4

2 に答える 2

0
private void btnSort_Click(object sender, RoutedEventArgs e)
    {
        **lstBox.BeginInit();**
        ListIconData objSelectedItem = (ListIconData)lstBox.SelectedItem;
        if (objSelectedItem.ItemSortDirection==SortDirection.None)
        {
            objSelectedItem.ImageSource = null;
            objSelectedItem.ImageSource = (ImageSource)FindResource("ImgDown");
        }
        **lstBox.EndInit();**

    }

動作させるために追加した太字のコード行を見つけてください。

于 2012-05-19T04:29:20.107 に答える
0

nikeee13 が提案したように、モデル クラスの変更に関する通知を送信する必要があります。

public class ListIconData : INotifyPropertyChanged
{
    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    public string DisplayText { get; set; }
    public SortDirection ItemSortDirection { get; set; }

    private ImageSource imgSource;
    public ImageSource ImageSource { 
        get{return imgSource;} 
        set{
              if(imgSource == null || !imgSource.Equals(value))
              {
                 imgSource = value;
                 OnPropertyChanged("ImageSource");
              }
           } 
    }
}
于 2012-05-18T10:26:56.013 に答える