在stackpanel中绑定数据

时间:2016-04-26 10:37:33

标签: c# wpf

我使用WPF和c#。

我有关于绑定和可见性的问题。 我有一棵绑在obsCol1上的树。然后我在网格中有一个表单,其datacontext设置为`

DataContext="{Binding ElementName=tree, Path=SelectedItem}">`

如果您愿意,我会在该表单中包含3个相同的子表单。 3个子表单中的每一个都是一个组合框,其中是一个水平堆栈面板,其中有一个标签文本框标签文本框按钮。

<GroupBox  Grid.Column="3" Grid.Row="8" Grid.ColumnSpan="3">
                    <GroupBox.Header>Reklama 1</GroupBox.Header>
                                <StackPanel Name="Rek1" DataContext="Reklame" Orientation="Horizontal">
                                    <Label Grid.Column="3"  Grid.Row="10" HorizontalAlignment="Right" VerticalAlignment="Top">Datum post/zam</Label>
                                    <xctk:DateTimePicker x:Name="dtReklama1" 
                                 Grid.Row="10" 
                                 Grid.Column="4"                                     
                                 Height="25" 
                                 Margin="3"
                                 Padding="3"
                                 VerticalAlignment="Top"
                                 HorizontalAlignment="Left"
                                 Width="150" Value="{Binding Path=Opr_brendiranje}"/>                                      
                                    <Label Grid.Column="3"  Grid.Row="8" HorizontalAlignment="Right" VerticalAlignment="Top">Dimenzija</Label>
                                    <extToolkit:WatermarkTextBox x:Name="Reklama" Grid.Row="8"
                     Grid.Column="4"                         
                     HorizontalAlignment="Left"
                     VerticalAlignment="Top"
                       Width="100"
                     Height="25"
                     Padding="3" 
                     Margin="3"
                     AcceptsReturn="True" 
                     Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
                     Validation.Error="Validation_Error">
                                        <extToolkit:WatermarkTextBox.Watermark>
                                            <TextBox Text="Reklama" Margin="4,2,2,0" FontWeight="Regular" Foreground="Silver" BorderThickness="0"/>
                                        </extToolkit:WatermarkTextBox.Watermark>
                                        <extToolkit:WatermarkTextBox.Text>
                                            <Binding Path="RekDimenzije"  UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"/>
                                        </extToolkit:WatermarkTextBox.Text>
                                    </extToolkit:WatermarkTextBox>
                                    <Button Grid.Column="5" Grid.Row="9" Height="20" Width="15" Click="Dodaj_Reklamu"  VerticalAlignment="Top" FontWeight="Bold" Margin="5" >+</Button>
                                </StackPanel>

                </GroupBox>

所以现在我需要绑定它,但问题是这些子表单使用与表单本身不同的类。它们本身就是一个实体。所以我想知道是否有任何方法可以独立地绑定它们,就像物品源组合框或堆栈面板或soemthing一样。我尝试使用itemscontrol并绑定到它但是这不起作用它会绑定itemsource但是如果itemsource为空,则控件将消失,因此不允许用户添加它。

任何帮助都将不胜感激。

更新

好的,我有一个用户控件。 在左侧是一个树,它使用HierarchicalDataTemplate绑定到2个不同的类,其中OrgSredstva是OrgClass,其中包含Sredstva类。

<TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Org_Sredstva}">
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="Focusable" Value="False"/>
                    </Style>
                </HierarchicalDataTemplate.ItemContainerStyle>
                <TextBlock Text="{Binding Path=Organizacije_Naziv}"/>
               <HierarchicalDataTemplate.ItemTemplate>                     
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Ossr_Naziv}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

    </TreeView>

这一切都很复杂,因为它听起来树很好。

在右侧是一个网格,就像我上面描述的那样,datacontext设置为在树中选择的任何内容。我需要这个,以便当树中的选择发生变化时,表单会随之改变。问题是树绑定的类都不是表单应该绑定的类。因此,网格无法找到数据,因为文本框绑定不在该可观察集合中,而是另一个。我解决这个问题的方法是绑定codebehind中的每个textbox.text属性

   public void OdabranoDrvo()
    {

         OdabranaOrg = this.View.tree.SelectedItem as Organizacije;



         if (OdabranaOrg != null)
        {
            string orgId = OdabranaOrg.Organizacije_Sifra;

            IEnumerable<Opremljenost> odabranaOpr = from fn in _oprema

                                                    where fn.Opr_org_sifra == orgId

                                                    select fn;
            var ob = new ObservableCollection<Opremljenost>(odabranaOpr);


            if (ob.Count > 0)
            {
                foreach (Opremljenost opr in odabranaOpr)
                {
                    this.View.Povrsina.Text = opr.Opr_Povrsina.ToString();                      
                    this.View.RadnoVrijeme.Text = opr.Opr_RadnoVrijeme;
                    if (opr.Opr_Vlasnik == 1)
                    {
                        this.View.LutRad.IsChecked = true;
                        this.View.ImeVlasnika.IsReadOnly = true;
                    }
                    else
                    {
                        this.View.LutRad.IsChecked = false;
                        this.View.ImeVlasnika.IsReadOnly = false;
                    }
                    this.View.ImeVlasnika.Text = opr.Opr_ime_vlasnik;
                    if (opr.Opr_brojilo == 1)
                    {
                        this.View.Brojilo.IsChecked = true;
                    }
                    else
                    {
                        this.View.Brojilo.IsChecked = false;
                    }
                    if (opr.Opr_ventilacija == 1)
                    {
                        this.View.Ventilacija.IsChecked = true;
                    }
                    else
                    {
                        this.View.Ventilacija.IsChecked = false;
                    }

                    this.View.dtBrendiranje.Value = opr.Opr_brendiranje;
                    this.View.dtKrecenje.Value = opr.Opr_krecenje;
                    this.View.Napomena.Text = opr.Opr_napomena;
                    this.View.BrojAparata.Text = opr.Opr_broj_aparata.ToString();
                    this.View.BrojRuleta.Text = opr.Opr_broj_ruleta.ToString();
                    this.View.UkupanBrojKlima.Text = opr.Opr_uku_br_klima.ToString();
                    this.View.BrojKlimaLutrija.Text = opr.Opr_br_kl_lut.ToString();
                    this.View.UkupanBrojTv.Text = opr.Opr_uku_broj_tv.ToString();
                    this.View.BrojTvLutrija.Text = opr.Opr_broj_tv_lut.ToString();
                    this.View.BrojTvPartneri.Text = opr.Opr_broj_tv_partneri.ToString();
                    this.View.StrujnaSnaga.Text = opr.Opr_struja_ang_snaga.ToString();
                    _slikeOpr = Ap.GlavniRepository.UcitajSlikeZaOpremu(opr.Opr_Id);
                    this.View.Thumbnails.ItemsSource = _slikeOpr;


                    _reklame = Ap.GlavniRepository.UcitajReklameZaOpremu(opr.Opr_Id);
                    int i = _reklame.Count();

                    if (i == 2)
                    {
                        this.View.Rek2.Visibility = Visibility.Visible;
                        this.View.Rek3.Visibility = Visibility.Collapsed;
                    }
                    else if (i == 3)
                    {
                        this.View.Rek2.Visibility = Visibility.Visible;
                        this.View.Rek3.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        this.View.Rek2.Visibility = Visibility.Collapsed;
                        this.View.Rek3.Visibility = Visibility.Collapsed;
                    }
                    this.View.Reklame.DataContext = _reklame;


                }

            }
            else
            {
                this.View.Povrsina.Text = "0";
                this.View.RadnoVrijeme.Text = String.Empty;
                this.View.LutRad.IsChecked=false;
                this.View.ImeVlasnika.Text = String.Empty;
                this.View.Brojilo.IsChecked = false;
                this.View.Ventilacija.IsChecked = false;
                this.View.dtBrendiranje.Value = DateTime.Now;
                this.View.dtKrecenje.Value = DateTime.Now;
                this.View.Napomena.Text = String.Empty;
                this.View.BrojAparata.Text = "0";
                this.View.BrojRuleta.Text = "0";
                this.View.UkupanBrojKlima.Text = "0";
                this.View.BrojKlimaLutrija.Text = "0";
                this.View.UkupanBrojTv.Text = "0";
                this.View.BrojTvLutrija.Text = "0";
                this.View.BrojTvPartneri.Text = "0";
                this.View.StrujnaSnaga.Text = "0";
                this.View.Thumbnails.ItemsSource = null;
                this.View.Rek2.Visibility = Visibility.Collapsed;
                this.View.Rek3.Visibility=Visibility.Collapsed;
            }
        }
    }

我通过在预先存在的网格中创建一个新网格来解决原始问题,并将内部网格的数据上下文设置为我需要的内容。现在我发现所有的绑定似乎至少在从数据库读取时起作用,还没有测试插入到数据库中。

我意识到这一切都非常难看但我无法找到一种方法来实际绑定它,而它仍然可以正常工作......

0 个答案:

没有答案