1

XamDataTree を使用しており、ノードのタイプごとに異なるイメージを持つノード アイコンが必要です。私はインフラジスティックスでこれを尋ねてみましたが、私たちはお互いを理解していません:(

また、問題はもはや彼らのコントロールとは何の関係もありません。それは、モデルに保存された画像を表示する方法に関するものです。はい、これは MVVM の原則に反していますが、これが画像を表示する唯一の実行可能な方法です。

注: 回避策があります。Label を使用してノードの内容を指定し、その中に画像とノード テキストを含む水平スタックパネルを配置します。しかし、これはくだらないです。XamDataGrid オブジェクトに画像を表示させたいのです。

ここに表示する 28 の異なる画像があり、そのうちのいくつかは動的に作成されます。そのため、ファイルパスで画像をロードしてから別のテンプレートを使用する、さまざまなテンプレートを大量に作成したくありません。

XamDataTree は、Element 名や!でバインドも指定してみました。. モデルから直接、または DataTemplate を介して画像を読み込もうとしています:

<ig:XamDataTree
    ScrollViewer.CanContentScroll="True"
    ItemsSource="{Binding Model}"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    NodeLineVisibility="Visible"
    >
    <ig:XamDataTree.Resources>
        <DataTemplate x:Key="nodeImage" >
            <Image Source="{Binding Path=NodeImage}" />
        </DataTemplate>
    </ig:XamDataTree.Resources>
    <ig:XamDataTree.GlobalNodeLayouts>
        <ig:NodeLayout
            ExpandedIconTemplate="{StaticResource nodeImage}"
            CollapsedIconTemplate="{Binding NodeImage}"
            Key="Children"
            DisplayMemberPath="Name"
            TargetTypeName="Model"
            >
        </ig:NodeLayout>
    </ig:XamDataTree.GlobalNodeLayouts>
</ig:XamDataTree>

私が使用しているモデルでは、画像ソースの値は別の場所に設定されています:

public class Model
{
    /// <summary>
    /// Image representing the type of node this is.
    /// </summary>
    public ImageSource NodeImage
    {
        get
        {
            return this.nodeImage;
        }
        set
        {
            this.nodeImage = value;
            this.OnPropertyChanged("NodeImage");
        }
    }

    /// <summary>
    /// Controls will bind their attributes to this event handler.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Fire an event alerting listners a property changed.
    /// </summary>
    /// <param name="name">Name of the property that changed.</param>
    public void OnPropertyChanged(string name)
    {
        // Check whether a control is listening.
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

編集:ファイルから BitmapImage に画像を直接読み込んでから、モデルに保存しようとしましたが、うまくいきませんでした。より高いデバッグ レベルのメッセージングを使用すると、データ バインディングが対応するプロパティを見つけられないというメッセージが出力にポストされます。したがって、問題は私のデータバインディングにある可能性が最も高いです。

4

2 に答える 2

3

もう 1 つの解決策は、コンバーターと、プロパティ NodeImage のタイプ Stream を使用することです。

コンバータ:

public class StreamToImageConverter : IValueConverter {
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        var imageStream = value as System.IO.Stream;
        if (imageStream != null)) {
            System.Windows.Media.Imaging.BitmapImage image = new System.Windows.Media.Imaging.BitmapImage();
            image.SetSource(imageStream );
            return image;
        }
        else {
           return null;
        }
    }

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

財産:

private Stream _imageStream;
public Stream NodeImage
{
    get
    {
        return _imageStream;
    }
    set
    {
        _imageStream= value;
        this.OnPropertyChanged("NodeImage");
    }
}

XAML:

<Grid>
   <Grid.Resources>
     <local:StreamToImageConverter x:Name="imageConverter"/>
   </Grid.Resources>
   <Image Source="{Binding Path=NodeImage, Converter={StaticResource imageConverter}" />
 </Grid>
于 2013-03-15T11:19:07.393 に答える
1

プロパティNodeImageを変更して、画像のパスを入力stringして返します。残りは、パスをImageSourceに変換するImageクラスとコンバータークラスによって行われます。

private string _imagePath;
public string NodeImage
{
    get
    {
        return _imagePath;
    }
    set
    {
        _imagePath = value;
        this.OnPropertyChanged("NodeImage");
    }
}
于 2013-03-15T10:48:21.907 に答える