связывание дерева просмотра wpf не может связать вложенное свойство в классе - PullRequest
0 голосов
/ 21 марта 2010

Новое в wpf и, следовательно, немного борется. Я собираю небольшую демонстрацию, прежде чем мы приступим к полной реализации У меня есть дерево слева с

Continent
    Country
       City  structure

когда пользователь выбирает город, он должен заполнить некоторые текстовые поля в таб-контроле справа

Я сделал это вроде как, но не могу заставить его работать с составными объектами.

В двух словах вы можете заметить, что не так с моим zaml или кодом. Почему нет привязки к моему CityDetails.ClubsCount или CityDetails.PubsCount?

То, что я строю, основано на http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

Большое спасибо за любые предложения или ответ

DataModel

public class City
{
    public City(string cityName)
    {
        CityName = cityName;
    }

    public string CityName { get; set; }
    public string Population { get; set; }
    public string Area { get; set; }
    public CityDetails CityDetailsInfo { get; set; }
}

public class CityDetails
{
    public CityDetails(int pubsCount,int clubsCount)
    {
        PubsCount = pubsCount;
        ClubsCount = clubsCount;
    }

    public int ClubsCount { get; set; }
    public int PubsCount { get; set; }
}

ViewModel

public class CityViewModel : TreeViewItemViewModel
{
    private  City _city;
    private RelayCommand _testCommand;
    public CityViewModel(City city, CountryViewModel countryViewModel):base(countryViewModel,false)
    {
        _city = city;
    }

    public string CityName
    {
        get { return _city.CityName; }
    }
    public string Area
    {
        get { return _city.Area; }
    }
    public string Population
    {
        get { return _city.Population; }
    }
    public City City
    {
    get { return _city; }
    set { _city = value; }
    }

    public CityDetails CityDetailsInfo
    {
        get { return _city.CityDetailsInfo; }
        set { _city.CityDetailsInfo = value; }
    }
}

1024 * XAML * <DockPanel> <DockPanel LastChildFill="True"> <Label DockPanel.Dock="top" Content="Title " HorizontalAlignment="Center"></Label> <StatusBar DockPanel.Dock="Bottom"> <StatusBarItem Content="Status Bar" ></StatusBarItem> </StatusBar> <Grid DockPanel.Dock="Top"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="2*"/> </Grid.ColumnDefinitions> <TreeView Name="tree" ItemsSource="{Binding Continents}"> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsExpanded,Mode=TwoWay}"/> <Setter Property="IsSelected" Value="{Binding IsSelected,Mode=TwoWay}"/> <Setter Property="FontWeight" Value="Normal"/> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="FontWeight" Value="Bold"></Setter> </Trigger> </Style.Triggers> </Style> </TreeView.ItemContainerStyle> <TreeView.Resources> <HierarchicalDataTemplate DataType="{x:Type ViewModels:ContinentViewModel}" ItemsSource="{Binding Children}"> <StackPanel Orientation="Horizontal"> <Image Width="16" Height="16" Margin="3,0" Source="Images\Continent.png"/> <TextBlock Text="{Binding ContinentName}"/> </StackPanel> </HierarchicalDataTemplate> <HierarchicalDataTemplate DataType="{x:Type ViewModels:CountryViewModel}" ItemsSource="{Binding Children}"> <StackPanel Orientation="Horizontal"> <Image Width="16" Height="16" Margin="3,0" Source="Images\Country.png"/> <TextBlock Text="{Binding CountryName}"/> </StackPanel> </HierarchicalDataTemplate> <DataTemplate DataType="{x:Type ViewModels:CityViewModel}" > <StackPanel Orientation="Horizontal"> <Image Width="16" Height="16" Margin="3,0" Source="Images\City.png"/> <TextBlock Text="{Binding CityName}"/> </StackPanel> </DataTemplate> </TreeView.Resources> </TreeView> <GridSplitter Grid.Row="0" Grid.Column="1" Background="LightGray" Width="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> <Grid Grid.Column="2" Margin="5" > <TabControl> <TabItem Header="Details" DataContext="{Binding Path=SelectedItem.City, ElementName=tree, Mode=OneWay}"> <StackPanel > <TextBlock VerticalAlignment="Center" FontSize="12" Text="{Binding CityName}"/> <TextBlock VerticalAlignment="Center" FontSize="12" Text="{Binding Area}"/> <TextBlock VerticalAlignment="Center" FontSize="12" Text="{Binding Population}"/> <!-- DONT WORK WHY--> <TextBlock VerticalAlignment="Center" FontSize="12" Text="{Binding SelectedItem.CityDetailsInfo.ClubsCount}"/> <TextBlock VerticalAlignment="Center" FontSize="12" Text="{Binding SelectedItem.CityDetailsInfo.PubsCount}"/> </StackPanel> </TabItem> </TabControl> </Grid> </Grid> </DockPanel> </DockPanel>

1 Ответ

0 голосов
/ 21 марта 2010

Посмотрите здесь (ненужные биты опущены):

<TabItem DataContext="{Binding Path=SelectedItem.City, ElementName=tree, Mode=OneWay}">
  <StackPanel >
    <!-- DONT WORK WHY-->
    <TextBlock Text="{Binding SelectedItem.CityDetailsInfo.ClubsCount}"/>
    <TextBlock Text="{Binding SelectedItem.CityDetailsInfo.PubsCount}" />
  </StackPanel>
</TabItem>

DataContext для TabItem - это SelectedItem.City: то есть DataContext - это город. Город не имеет свойства SelectedItem. Измените привязки, например, на

<TextBlock Text="{Binding CityDetailsInfo.ClubsCount}" />

т.е. начните путь с текущего DataContext, в данном случае объекта City.

В качестве подсказки в окне вывода Visual Studio отображаются ошибки привязки, которые часто могут предоставить достаточно информации для немедленной диагностики, например, если вы видите «Свойство SelectedItem», не найденное в «City», то ясно, что WPF не смотрит на объект, который, как вы думаете, он смотрит!

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