Wpf триггер для изменения изображения элемента дерева - PullRequest
0 голосов
/ 06 апреля 2010

Я связываю древовидную структуру, используя иерархическую структуру классов следующим образом.

Магазин -> ImagePath -> Список -> Список

Когда я создаю шаблон данных для человека, я хочу использовать комбинацию person.name и путь к изображению, объявленный в Магазине. Вот код моего файла MainWindow.xaml. публичный частичный класс MainWindow: Window { public MainWindow () { InitializeComponent ();

        Customers customers = new Customers();
        customers.Users = new List<Person> 
        { 
            new Person { Name = "John"},
            new Person { Name = "Adam"}, 
            new Person { Name = "Smith"}
        };

        Store root = new Store();
        root.ImagePath = "imageone.png";
        root.Add(customers);
        this.DataContext = root;
    }
}


public class Store : ObservableCollection<Customers> 
{
    public string ImagePath
    {
        get;
        set;
    }
} 
public class Customers
{
    public string Label
    {
        get
        {
            return string.Format("People({0})", Users.Count());
        }
    }
    public List<Person> Users
    {
        get;
        set;
    } 
}
public class Person
{
    public string Name
    {
        get;
        set;
    }
}`

а вот xaml и этот Source = "{Binding Store.ImagePath}" не работает.

    <Window.Resources >
   <DataTemplate DataType="{x:Type local:Person}" x:Key="personKey" >
        <StackPanel Orientation="Horizontal" >
            <Image Source="{Binding Store.ImagePath}"></Image>
            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </DataTemplate>
    <HierarchicalDataTemplate x:Key="customerKey" ItemsSource="{Binding Users}" ItemTemplate="{StaticResource personKey }" >
        <TextBlock Text="{Binding Label}" FontWeight="Bold"/>
    </HierarchicalDataTemplate>
</Window.Resources>
<Grid>
    <Canvas>
        <Button HorizontalAlignment="Left" DockPanel.Dock="Top" Height="29" Width="112" Canvas.Left="123" Canvas.Top="5">Image one</Button>  <Button HorizontalAlignment="Left" VerticalAlignment="Top" DockPanel.Dock="Top" Height="28" Width="119" Canvas.Left="249" Canvas.Top="7">Image two</Button>
        <TreeView  HorizontalAlignment="Stretch"  Name="treeView1" VerticalAlignment="Stretch" 
               ItemsSource="{Binding .}" ItemTemplate="{StaticResource customerKey}" Height="260" Width="363" Canvas.Left="81" Canvas.Top="45" />
    </Canvas>
</Grid>

Я также хотел бы изменить изображение programaticaaly, и все элементы древовидной структуры человека меняются при нажатии на кнопки.

Спасибо

1 Ответ

1 голос
/ 06 апреля 2010

DataTemplate personKey будет привязан к объекту Person (потому что это ItemTemplate для customerKey HierarchicalDataTemplate, ItemSource которого является коллекцией Users).Как всегда в WPF, локальный DataContext переопределяет унаследованный DataContext, а DataContext внутри DataTemplate всегда является объектом, для которого материализуется DataTemplate.

Таким образом, путь привязки Store.ImagePath разрешается относительноЧеловек, отображаемый в шаблоне данных.Но у Person нет свойства Store, поэтому привязка завершается неудачей.

Быстрый, но довольно неуклюжий способ ссылки на свойства уровня окна - использование привязки RelativeSource:

<Image Source="{Binding Path=DataContext.Store.ImagePath,
                        RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...