Простой вопрос привязки данных WPF с иконками - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть несколько типов, которые составляют иерархию, подобную этой:

+ Image0.Name
    Effect0.Name
    Effect1.Name
    Effect2.Name
    Layer0.Name
    Layer1.Name
    Layer2.Name
    ...
+ Image1.Name
    Effect0.Name
    Effect1.Name
    Effect2.Name
    Layer0.Name
    Layer1.Name
    Layer2.Name
    ...
+ Image2.Name
    Effect0.Name
    Effect1.Name
    Effect2.Name
    Layer0.Name
    Layer1.Name
    Layer2.Name
    ...

Но я не могу разобраться с привязкой данных.Вот код для типов:

public class Image
{
    public string Name { get; set; }

    public IEnumerable<Effect> Effects { get; set; }
    public IEnumerable<Layer> Layers { get; set; }
}

public class Effect
{
    public string Name { get; set; }

    public Effect ( string name )
    {
        this.Name = name;
    }
}

public class Layer
{
    public string Name { get; set; }

    public Layer ( string name )
    {
        this.Name = name;
    }
}

public class EditorView : INotifyPropertyChanged
{
    IEnumerable<Node> images;
    public IEnumerable<Node> Images
    {
        get { return images; }
        set
        {
            this.images = value;
            this.RaisePropertyChanged ( "Images" );
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void RaisePropertyChanged ( string propertyName )
    {
        var handler = this.PropertyChanged;
        if ( handler != null )
            handler ( this, new PropertyChangedEventArgs ( propertyName ) );
    }
}

Кроме того, эти типы (Effect, Layer) имеют уникальную иконку для каждого типа, если вы также можете показать, как связать это, это поможет мнемного в понимании всего этого.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Так я обычно делаю, создаю базовый класс для дочерних элементов, а затем создаю свойство I, которое возвращает все дочерние элементы

 public class Image 
 { 
    public string Name { get; set;} 
    public IEnumerable<Effect> Effects { get; set; } 
    public IEnumerable<Layer> Layers { get; set; }
    public IEnumerable<Node> Nodes { get { return ((IEnumerable<Node>)Layers).Union((IEnumerable<Node>)Effects); } }
}

 public class Effect : Node
{
    public Effect(string name) 
    { 
        this.Name = name; 
    } 
}
public class Layer : Node
{ 
      public Layer(string name) { this.Name = name; } 
}

public class Node
{
    public string Name { get; set; }
    public Image Icon { get; set; }
}

Вы должны иметь возможность установить свойство изображения (URL-адрес изображения, но вы можете изменить тип свойства) соответствующих эффектов и слоев, и тогда я уже настроил его, это должно работать

 <TreeView Height="221" HorizontalAlignment="Left" Margin="12,12,0,0" Name="treeView1" 
              VerticalAlignment="Top" Width="479" ItemsSource="{Binding Images}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}"></TextBlock>
                    <Image Source="{Binding Icon}"></Image>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

EDIT

А затем установите DataContext элемента TreeView в ViewModel, просто как пример, который я сделал в следующем коде:

Image img = new Image();
Effect effect = new Effect("Effect1");
Layer layer = new Layer("Layer1");
img.Name = "Image1";
List<Effect> effects = new List<Effect>();
effects.Add(effect);
img.Effects = effects;
List<Layer> layers = new List<Layer>();
layers.Add(layer);
img.Layers = layers;
List<WpfApplication1.Image> Images = new List<Image>();
Images.Add(img);
EditorView ev = new EditorView();
ev.Images = Images;
treeView1.DataContext = ev;

РЕДАКТИРОВАТЬ 2: Вставить полный код (без использования операторов):

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new EditorView();
    }
}

public class Image 

{ 
    public string Name { get; set;} 
    public IEnumerable<Effect> Effects { get; set; } 
    public IEnumerable<Layer> Layers { get; set; }
    public IEnumerable<Node> Nodes { get { return ((IEnumerable<Node>)Layers).Union((IEnumerable<Node>)Effects); } }
}
public class Effect : Node
{
    public Effect(string name) 
    { 
        this.Name = name; 
    } 
}
public class Layer : Node
{ 
      public Layer(string name) { this.Name = name; } 
}

public class Node
{
    public string Name { get; set; }
    public string Icon { get; set; }
}

public class EditorView : INotifyPropertyChanged 
{
    public EditorView()
    {
        Image img = new Image();
        WpfApplication1.Effect effect = new WpfApplication1.Effect("Effect1");
        WpfApplication1.Layer layer = new Layer("Layer1");
        img.Name = "Image1";
        List<Effect> effects = new List<WpfApplication1.Effect>();
        effects.Add(effect);
        img.Effects = effects;
        List<Layer> layers = new List<Layer>();
        layers.Add(layer);
        img.Layers = layers;
        List<WpfApplication1.Image> Images = new List<Image>();
        Images.Add(img);
        this.Images = Images;
    }

    IEnumerable<Image> images;
    public IEnumerable<Image> Images 
    { 
        get 
    { 
            return images; 
    } 
        set { this.images = value; this.RaisePropertyChanged("Images"); 
        } 
    } public event 
        PropertyChangedEventHandler 
        PropertyChanged; 
    void RaisePropertyChanged(string propertyName) 
    { var handler = this.PropertyChanged; 
        if (handler != null)            

            handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
}
}
1 голос
/ 18 апреля 2011

Вам необходимо реализовать HierarchicalDataTemplate .Для примера посмотрите на последнюю статью - http://msdn.microsoft.com/en-us/library/ms742521.aspx, а эту - http://blogs.msdn.com/b/chkoenig/archive/2008/05/24/hierarchical-databinding-in-wpf.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...