Привязка данных не работает правильно - PullRequest
1 голос
/ 22 января 2012

Я думаю, что это может быть ошибкой.У меня есть страница с элементом управления Pivot с 5 элементами:

Каждый элемент PivotItem ссылается на один и тот же шаблон как статический ресурс, и у каждого из них свой текст данных (ObservableCollection).Шаблон имеет ListBox и TextBlock.Оба используют конвертер значений для видимости.По сути, он скрывает и показывает их соответственно в зависимости от того, пуста коллекция или нет:

<phone:PhoneApplicationPage 
x:Class="PhoneApp2.PivotPage1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:p="clr-namespace:PhoneApp2"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"  Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<phone:PhoneApplicationPage.Resources>
    <p:CollectionToVisibilityConverter x:Key="CollectionToVisibility" />
    <ControlTemplate x:Key="Template">
        <StackPanel>
            <ListBox ItemsSource="{Binding}" Visibility="{Binding Converter={StaticResource CollectionToVisibility}, ConverterParameter=false}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Text1}" Padding="5,0" />
                            <TextBlock Text="{Binding Text2}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <TextBlock Text="Empty" Visibility="{Binding Converter={StaticResource CollectionToVisibility}, ConverterParameter=true}" />
        </StackPanel>

    </ControlTemplate>
</phone:PhoneApplicationPage.Resources>
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="150" />
    </Grid.RowDefinitions>
    <controls:Pivot Title="MY APPLICATION">
        <controls:PivotItem Header="item1" DataContext="{Binding Model1}" Template="{StaticResource Template}" />
        <controls:PivotItem Header="item2" DataContext="{Binding Model2}" Template="{StaticResource Template}" />
        <controls:PivotItem Header="item3" DataContext="{Binding Model3}" Template="{StaticResource Template}" />
        <controls:PivotItem Header="item4" DataContext="{Binding Model4}" Template="{StaticResource Template}" />
        <controls:PivotItem Header="item5" DataContext="{Binding Model5}" Template="{StaticResource Template}" />
    </controls:Pivot>
    <StackPanel Grid.Row="1">
        <Button Content="Clear Items" Click="Button_Click" />
        <Button Content="Add Items" Click="Button_Click_1" />
    </StackPanel>

</Grid>   

Код:

public partial class PivotPage1 : PhoneApplicationPage
{
    public PivotPage1()
    {
        InitializeComponent();
        var vm = new ViewModel();

        vm.Model1 = new ObservableCollection<Model>();
        vm.Model2 = new ObservableCollection<Model>();
        vm.Model3 = new ObservableCollection<Model>();
        vm.Model4 = new ObservableCollection<Model>();
        vm.Model5 = new ObservableCollection<Model>();

        Populate(vm);

        DataContext = vm;
    }

    private void Populate(ViewModel vm)
    {
        vm.Model1.Add(new Model { Text1 = "1", Text2 = "World" });
        vm.Model1.Add(new Model { Text1 = "1", Text2 = "Planet" });

        vm.Model2.Add(new Model { Text1 = "2", Text2 = "World" });
        vm.Model2.Add(new Model { Text1 = "2", Text2 = "Planet" });

        vm.Model3.Add(new Model { Text1 = "3", Text2 = "World" });
        vm.Model3.Add(new Model { Text1 = "3", Text2 = "Planet" });

        vm.Model4.Add(new Model { Text1 = "4", Text2 = "World" });
        vm.Model4.Add(new Model { Text1 = "4", Text2 = "Planet" });

        vm.Model5.Add(new Model { Text1 = "5", Text2 = "World" });
        vm.Model5.Add(new Model { Text1 = "5", Text2 = "Planet" });
    }

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        ViewModel vm = DataContext as ViewModel;
        vm.Model1.Clear();
        vm.Model2.Clear();
        vm.Model3.Clear();
        vm.Model4.Clear();
        vm.Model5.Clear();
    }

    private void Button_Click_1(object sender, System.Windows.RoutedEventArgs e)
    {
        ViewModel vm = DataContext as ViewModel;
        Populate(vm);
    }
}

public class ViewModel
{
    public ObservableCollection<Model> Model1 { get; set; }
    public ObservableCollection<Model> Model2 { get; set; }
    public ObservableCollection<Model> Model3 { get; set; }
    public ObservableCollection<Model> Model4 { get; set; }
    public ObservableCollection<Model> Model5 { get; set; }
}

public class Model
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
}

Конвертер:

public class CollectionToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        IList list = value as IList;
        bool isEmptyVisible = false;
        if (parameter != null)
            bool.TryParse(parameter.ToString(), out isEmptyVisible);

        if (list == null || list.Count == 0)
            return isEmptyVisible ? Visibility.Visible : Visibility.Collapsed;

        return isEmptyVisible ? Visibility.Collapsed : Visibility.Visible;
    }

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

Если вы запустите это приложение и очистите и снова заполняете коллекции (нажимая кнопки), вы заметите, что некоторые элементы сводки работают должным образом, а другие - нет.

Это ошибка?Я что-то не так делаю?

Спасибо,

1 Ответ

0 голосов
/ 05 февраля 2012

Единственное, что выделяется, - это отсутствие INotifyPropertyChanged в классе вашей модели

public class Model : INotifyPropertyChanged
{
    private string m_Text1;
    public string Text1 
    { 
        get { return m_Text1;} 
        set { m_Text1 = value; 
              OnPropertyChanged(new PropertyChangedEventArgs("Text1")); }

    // ...

    #region INotifyPropertyChanged: Shared bit
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
    if (PropertyChanged != null)
        PropertyChanged(this, e);
    }
    #endregion

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