Контроль пользователя в таблице данных не синхронизирован - PullRequest
0 голосов
/ 22 февраля 2012

Итак, я хочу иметь несколько вкладок с пользовательским контролем в зависимости от того, сколько элементов в списке.так что я думаю, что это не будет слишком сложно, но .... Я начинаю с нового окна, чтобы создать tabcontroller и привязать его источник ресурсов (tabcontroler к списку):

<Window x:Class="xxxxx.extraforms.frmownedchamps"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               xmlns:sp="clr-xxxxx.usercontrols.ucoptions"
        Title="frmownedchamps" Height="593" Width="350" Loaded="Window_Loaded_1" ResizeMode="NoResize" WindowStyle="None" ShowInTaskbar="False">
    <Grid>
        <TabControl Name="thetabcontrol">
            <TabControl.ItemTemplate>
                <DataTemplate>

                    <StackPanel>
                        <Label  Content="{Binding name}" />
                    </StackPanel>

                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate DataType="{x:Type sp:ucownedchampviewer}" >
                    <sp:ucownedchampviewer strname="{Binding Path=name}" strcode="{Binding Path=code}" clclist="{Binding Path=list}" teller="{Binding Path=teller}"  />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>

    </Grid>
</Window>

как только окно получитзагружен он только thetabcontrol.ItemsSource = settings.clclist;

clclist это:

     public static List<clc> clclist { get; set; }

    public void methodblabla()
    {
     foreach( xml blabla)
    {
    clc clctemp = new clc(xmlname, xmlcode);
    clclist.Add(clctemp);
    }
    }

the clc class is:

 public class clc
        {
            private static int counter = 0;
            public int teller { get; set; }
            public String name { get; set; }
            public String code { get; set; }
            public ObservableCollection<champion> list { get; set; }
            public clc(String name, String code)
            {

                this.name = name;
                this.code = code;
                teller = counter;
                counter++;
                makelist();
            }
            public void makelist()
            {
                var bytes = Convert.FromBase64String(code);
                var values = new System.Collections.BitArray(bytes);
                list = new ObservableCollection<champion>();
                int aantal = champions.list.Count;
                int teller = 0;
                int counter = 0;
                for (int x = aantal; x != 0; x--)
                {
                    if (values[x - 1] == true)
                    {
                        list.Add(champions.getchampbyid(counter + 1));
                        teller++;
                    }
                    counter++;
                }
            }
        }  

мой usercontrol:

<UserControl x:Class="xxxxx.usercontrols.ucoptions.ucownedchampviewer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:sp="clr-namespace:xxxxx"
             mc:Ignorable="d" 
             d:DesignHeight="564" d:DesignWidth="350" Loaded="UserControl_Loaded">
    <Grid Height="624">
        <Grid.Resources>
            <Style x:Key="Ownedstyle" TargetType="{x:Type ListViewItem}">
                <Setter Property="Background" Value="Red"></Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding strowned}" Value="Yes">
                        <Setter Property="Background" Value="Green"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
            <StackPanel Margin="0,0,0,12">
            <StackPanel Orientation="Horizontal" Margin="5">
                <TextBox Name="txtclc" Width="250" Margin="2" Text="{Binding Path=strcode ,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
                <Button Name="btnload" Content="Save" Click="btnsave_Click" Width="55" Margin="2"/>
            </StackPanel>
            <Line Margin="2" />
            <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Stretch" Width="350">
                <TextBlock VerticalAlignment="Center">Filter:</TextBlock>
                <TextBox Name="txtfilter" Height="30" Grid.Column="0" TextChanged="txtfilter_TextChanged" Margin="5" Width="250" />
                <Label Name="lblaantal"></Label>
            </StackPanel>
            <ListView Name="lsvallchamps"  Grid.Column="0" Grid.Row="1" Grid.RowSpan="1" Height="410" Width="auto" ItemContainerStyle="{StaticResource Ownedstyle}" ItemsSource="{Binding Path=clclist ,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="60">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="50" Source="{Binding image}" Stretch="Fill"></Image>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Width="120" DisplayMemberBinding="{Binding name}">
                            <GridViewColumnHeader Content="name" Tag="name" Click="SortClick"/>
                        </GridViewColumn>
                        <GridViewColumn Width="130" DisplayMemberBinding="{Binding strroles}">
                            <GridViewColumnHeader Content="strroles" Tag="strroles" Click="SortClick" />
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
            <Button Content="testknop" Click="Button_Click" />
            <Button Content="Hide" Name="btnhide" Width="150" Height="35" Margin="5" Click="btnhide_Click"></Button>
        </StackPanel>
    </Grid>
</UserControl>

Извините за такой большой код,но, может быть, лучше слишком много, чем слишком мало кода.Проблема в том, что я хочу, чтобы кнопка btnsave сохранила txtclc.text в коде и создала новый список, (а затем список должен автоматически изменяться в соответствии с ним, поскольку он привязан к нему). Однако, как только я используюкод

   private void btnsave_Click(object sender, RoutedEventArgs e)
        {
            settings.clclist[teller].code = txtclc.Text;
            settings.clclist[teller].makelist();
        }

Это меняет это!Я могу видеть это с debug.writeline, что значение изменилось в списке clclist.НО список в этой вкладке не меняется!ТОЛЬКО если я перейду к другой вкладке, то вернусь к первой, после чего она поменяется с правильными чемпионами.Там даже есть 2-я проблема.O Но если я перейду на другую вкладку (usercontrol), txtclc.text также изменится на первую!также список не обновляется на пользовательском контроле, ни на!однако метод makelist должен изменить это?Извините за этот длинный вопрос, однако я много гуглил, и мне не повезло с этой проблемой.

РЕШЕНИЕ:

Replace Text = "{Binding Path = strcode, RelativeSource ={RelativeSource AncestorType = {x: Type UserControl}}} "с текстом =" {Binding Path = code} "в пользовательском контроле.и добавьте INotifyPropertyChanged в класс clc, спасибо Рэйчел!

1 Ответ

2 голосов
/ 22 февраля 2012

У вас есть две проблемы здесь.

Во-первых, ваши классы не реализуют INotifyPropertyChanged , поэтому пользовательский интерфейс не знает, что его объекты изменились. Сделайте так, чтобы ваш класс clc реализовал этот интерфейс, и вызовите событие PropertyChanged, когда свойства code и name изменятся, чтобы пользовательский интерфейс мог обновиться.

Вторая проблема заключается в том, что по умолчанию WPF будет повторно использовать шаблон, если это возможно. Например, ваш TabControl создает один экземпляр вашего UserControl, а когда вы переключаете вкладки, он просто меняет DataContext за UserControl. Если txtclc.Text не привязан к чему-либо в DataContext, он не изменится, потому что вы просматриваете точно такой же TextBox независимо от того, какую вкладку вы просматриваете. Решение состоит в том, чтобы добавить свойство к вашему DataContext объекту для хранения Text txtclc TextBox и связать свойство.

...