如何绑定绑定到绑定到wpf中不同集合的树的网格中的表单

时间:2016-03-23 09:07:24

标签: c# wpf data-binding tree

好的,这有点难以解释。我有一个有树和视图的视图。树被绑定到2个不同的可观察集合。

<TreeView FontFamily="Calibri" FontSize="16" Name="tree" Margin="3" Grid.Row="1" Grid.Column="0"  Height="950" VerticalAlignment="Top" Grid.ColumnSpan="2"

              ItemsSource="{Binding Path=Org, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItemChanged="tree_SelectedItemChanged"  >             

    <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Org_Sredstva}">
                <TextBlock Text="{Binding Path=Organizacije_Naziv}"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Ossr_Naziv}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

现在树旁边有一个表格。并且表单应该绑定到第三个可观察的集合,该集合根据树的选择项而变化。

<Grid Grid.Row="2" Grid.Column="2" Margin="5" DataContext="{Binding ElementName=tree, Path=SelectedItem}">

正如您所看到的,绑定是绑定到不同可观察集合的树。

 <extToolkit:WatermarkTextBox x:Name="RadnoVrijeme" Grid.Row="1"
                     Grid.Column="1" 
                     Grid.ColumnSpan="2"
                     HorizontalAlignment="Left"
                     VerticalAlignment="Bottom"
                       Width="100"
                     Height="25"
                     Padding="3" 
                     Margin="3"
                     AcceptsReturn="True" 
                     Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
                     Validation.Error="Validation_Error">
                    <extToolkit:WatermarkTextBox.Watermark>
                        <StackPanel Orientation="Horizontal">
                            <TextBox Text="Radno Vrijeme" Margin="4,2,2,0" FontWeight="Regular" Foreground="Silver" BorderThickness="0"/>
                        </StackPanel>
                    </extToolkit:WatermarkTextBox.Watermark>
                    <extToolkit:WatermarkTextBox.Text>
                        <Binding Path="Opr_RadnoVrijeme" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                            <Binding.ValidationRules>
                                <validation:InputLenghtRule MinLength="10" MaxLength="250" ValidatesOnTargetUpdated="True"/>
                            </Binding.ValidationRules>
                        </Binding>
                    </extToolkit:WatermarkTextBox.Text>
                </extToolkit:WatermarkTextBox>

这是一个文本框,它绑定到第三个集合的属性,但它显然不起作用,因为该集合永远不会在任何地方设置为itemssource。

我找到的解决方法是在代码隐藏中单独设置每个文本框

this.View.RadnoVrijeme.Text = opr.Opr_RadnoVrijeme;

等式的左边是文本框的文本属性,右边是collection.property。这有效,但我不喜欢它,并希望有一种方法来实际绑定它?

1 个答案:

答案 0 :(得分:0)

你应该定义一下MVVM。它采用模块化设计,其中View由ViewModels控制的多个视图组成。那么解决任何类型的依赖(关系?选择?)问题都很容易。

在你的情况下,你试图直接绑定到<div id="wrapper"> <div id="content"> <span>HELLO!</span> </div> </div>,而在MVVM中你将处理selection然后你有可能上升相关属性更改的通知,这将导致更新相应的View元素自动。

以下是一个通用示例:

SelectedItem

如果ItemVM _selectedItem; public ItemVM SelectedItem { get { return _selectedItem; } set { _selectedItem = value; OnPropertyChanged(); // trigger update in the view OnPropertyChanged(nameof(SomeRelatedProperty)); } } // bind TextBlock.Text to that property public string SomeRelatedProperty { get { // some logic based on selected item if(SelectedItem.SomeProperty == SomeValue) return "a"; ... return "b"; } } 已经将值作为属性之一(因为它是一个ViewModel),那么更酷的事情,然后假设所有ViewModel实现SelectedItem,您可以直接绑定到该属性,并且只要选择项目已更改,视图将更新以显示该属性:

INotifyPropertyChanged

至于你得到的错误:

  

System.Windows.Data错误:40:BindingExpression路径错误:&#39; Opr_RadnoVrijeme&#39;在&#39; object&#39;上找不到的属性&#39;&#39; Organizacije&#39; (的HashCode = 23451234)&#39 ;. BindingExpression:路径= Opr_RadnoVrijeme;的DataItem =&#39; Organizacije&#39; (的HashCode = 23451234);目标元素是&#39; WatermarkTextBox&#39; (名称=&#39; RadnoVrijeme&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;)

尝试绑定(非常不确定,你没有提供ViewModel来解决这个问题):

<TextBlock Text="{Binding SelectedItem.SomeProperty} ... / >