2012-02-22 2 views
0

그래서 목록에있는 항목의 수에 따라 userControl이있는 여러 개의 탭이 필요합니다. 윈도우가로드 일단데이터 컨트롤의 사용자 정의 컨트롤이 동기화되지 않음

<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> 

: 그래서 내가 tabcontroller을하고 (목록에 tabcontroler의)의 itemsource을 결합하는 새로운 윈도우로 시작 ....이 shoudn t 너무 열심히 할 생각하지만, 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을 :

mayby ​​더 나은 너무 많은 다음
<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를 코드에 저장하고 새 목록을 만들려는 것입니다. (그리고 나서 listview는 바인드 된 이후 자동으로 바뀌어야합니다) 그러나 일단 사용하면 코드

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가 첫 번째 탭으로 변경됩니다! 또한 목록은 usercontrol에서 업데이트되지 않습니다. 그러나 makelist 방법은 그것을 변경해야합니까? 그러나이 긴 질문에 대해 유감스럽게 생각하지만 나는이 문제에 대해 많은 답변을 얻지 못했습니다.

해결책 :

것은 = 텍스트 바꾸기 "{바인딩 경로 = strcode, RelativeSource = {RelativeSource AncestorType = {X : 유형의 UserControl}}}"텍스트 = "{바인딩 경로 = 코드}"의 usercontrol. INotifyPropertyChanged를 clc 클래스에 추가하십시오. Thx from Rachel!

답변

2

여기에는 두 가지 문제가 있습니다.

첫 번째로 클래스가 INotifyPropertyChanged을 구현하지 않기 때문에 UI에 개체가 변경되었다는 것을 알 수 없습니다. UI를 업데이트 할 수 있도록 codename 속성이 변경되면 clc 클래스가이 인터페이스를 구현하고 PropertyChanged 이벤트를 발생시킵니다.

두 번째 문제는 기본적으로 WPF가 가능하면 템플릿을 다시 사용한다는 것입니다. 예를 들어 TabControlUserControl의 인스턴스를 하나 만들고 있으며 탭을 전환하면 UserControl 뒤의 DataContext 만 변경됩니다. txtclc.TextDataContext에있는 항목에 바인딩되지 않은 경우보고있는 탭에 관계없이 정확히 동일한 TextBox을보고 있기 때문에 변경되지 않습니다. 해결책은 DataContext 개체에 속성을 추가하여 txtclc TextBox의 Text을 저장하고 속성을 바인딩하는 것입니다.

+0

Ty for this! 나는 INotifyPropertyChanged를 암시했다. UI가 업데이트되어야한다. :) 그러나 당신이 또한 당신이 무엇을 의미하는지 알아낼 수 없다는 답을 제공 한 제 2 문제 : txtclc의 텍스트를 저장하기 위해 내 datacontext에 속성을 추가하십시오. 나는 데이터 액터 텍스트를 가지고있다 : p. 당신이 의미하는 바는 이제 google이 될 것입니다. 그러나 내가 excatly해야만하는 것은 조금 더 많은 정보가 매우 달콤 할 것입니다. 그러나 이미 감사합니다!:) – Maximc

+0

@ Maximc 여러분의 경우'DataContext'는 객체'clc'의 인스턴스처럼 보이므로 거기에 속성을 추가하십시오. DataContext가 어딘가에서 작동하는 방법에 대한 작은 예제를 작성했다는 것을 기억합니다. 찾을 수 있는지 보겠습니다. – Rachel

+0

@Maximc 찾았습니다. 내 대답 [여기] (http://stackoverflow.com/a/7262322/302677) – Rachel

관련 문제