UserControl中控件的WPF绑定
我在UserControl中有一个组合框。我在带有DataGrid的窗口中使用UserControl:UserControl DataContext是DataGrid SelectedItem。UserControl中的ComboBox通过SelectedValue属性绑定到SelectedItem的“ID”字段。为了实现这一点,我在UserControl中编程了DependencyProperty,如下所示UserControl中控件的WPF绑定,wpf,data-binding,user-controls,Wpf,Data Binding,User Controls,我在UserControl中有一个组合框。我在带有DataGrid的窗口中使用UserControl:UserControl DataContext是DataGrid SelectedItem。UserControl中的ComboBox通过SelectedValue属性绑定到SelectedItem的“ID”字段。为了实现这一点,我在UserControl中编程了DependencyProperty,如下所示 Public Shared SelectedValueProperty As Depe
Public Shared SelectedValueProperty As DependencyProperty = _
DependencyProperty.Register("SelectedValue", GetType(Object), GetType(ucEditCombo))
Public Property SelectedValue() As Object
Get
Return CType(GetValue(SelectedValueProperty), Object)
End Get
Set(ByVal value As Object)
SetCurrentValue(SelectedValueProperty, value)
End Set
End Property
并将ComboBox SelectedValue属性绑定到XAML中的UserControl SelectedValue属性:
<ComboBox SelectedValuePath="{Binding ElementName=EditCombo,Path=SelectedValuePath}"
DisplayMemberPath="{Binding ElementName=EditCombo,Path=DisplayMemberPath}"
ItemsSource="{Binding ElementName=EditCombo,Path=ItemsSource}"
SelectedValue="{Binding ElementName=EditCombo,Path=SelectedValue,Mode=TwoWay}"
Visibility="{Binding ElementName=EditCombo,Path=ComboVisibility}"
Name="cmb"/>
(EditCombo是我在XAML中给UserControl的x:Name)
运行应用程序时,我不会执行以下操作:
关于更新原始DataGrid SelectedItem的问题并不明显,尽管我认为这与ComboBox上的绑定有关。我需要查看窗口xaml和UserControl的代码才能确定 我试图用一个例子来重现这个问题,但我无法做到。所以为了加快你的前进速度,我发布了下面的例子 假设:UserControl试图修改绑定到SelectedValue DependencyProperty的对象的属性,而不是试图替换该对象。如果假设不正确,请使用与问题相关的额外代码更新问题,我将尝试更新我的答案 首先,我有一个为StackOverflow问题创建代码时使用的模型,称为ItemModel
Public Class ItemModel
Public Property Id as Guid
Public Property Text as String
End Class
在这个窗口中,我创建了一个名为Items的ObservableCollection(Of ItemModel)属性。它包含3个项目,每个项目的文本属性设置为值“一”、“二”或“三”之一。每个项目的Id都设置为新的guid
所以,我的主窗口xaml看起来像
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:this="clr-namespace:StackOverflow._20798974"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
<this:ucEditCombo SelectedValue="{Binding ElementName=MyGrid, Path=SelectedItem}" />
</StackPanel>
<DataGrid x:Name="MyGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
<DataGridTextColumn Header="Text" Binding="{Binding Text}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>
ucEditCombo UserControl的代码包含您在上述问题中定义的DependencyProperty和一个ObservableCollection(字符串),其中填充了值“一”、“二”、“三”和“四”
用户控件的xaml是
<UserControl x:Class="ucEditCombo" 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:this="clr-namespace:StackOverflow._20798974"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type this:ucEditCombo}}}">
<ComboBox ItemsSource="{Binding Path=Items}" SelectedValue="{Binding Path=SelectedValue.Text}" />
</Grid>
</UserControl>
上面的示例允许我选择一个DataGrid项,并使该项的Text属性立即显示在组合框中。它还允许在组合框中选择不同的值,并在数据网格中更新该值
注意事项
我希望这能有所帮助。谢谢你的回答,非常有启发性!对于我的个人问题,我唯一需要改变的是:(1)我在ucEditCombo XAML中设置SelectedValue=“{Binding Path=SelectedValue}”;(2) SelectedValue=“{Binding ElementName=MyGrid,Path=SelectedItem[field_Name]}”在使用UserControl的窗口XAML中。通过这样做,我可以绑定到当前所选DataRowView中需要的任何字段。