好的,这有点难以解释。我有一个有树和视图的视图。树被绑定到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。这有效,但我不喜欢它,并希望有一种方法来实际绑定它?
答案 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} ... / >