我在UserControl中有一个ComboBox。我在带有DataGrid的Window中使用UserControl:UserControl DataContext是DataGrid SelectedItem。 UserControl中的ComboBox通过SelectedValue属性绑定到SelectedItem的“ID”字段。为了实现这一点,我在UserControl中编写了一个DependencyProperty,就像这样
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是x:我在XAML中为UserControl提供的名称)。
运行应用程序我不是以下内容:
答案 0 :(得分:0)
有关更新原始DataGrid SelectedItem的问题并不明显,尽管我认为它与ComboBox上的绑定有关。我需要看看Window xaml和UserControl的代码,以确保。
我尝试用一个例子重现问题,但我无法做到。因此,为了加快您的行动,我已经发布了以下示例。
假设:UserControl正在尝试修改绑定到SelectedValue DependencyProperty的对象的属性,而不是尝试替换该对象。 如果假设不正确,使用与问题相关的额外代码更新问题,我将尝试更新我的答案。
首先,我在创建名为ItemModel的StackOverflow问题的代码时使用了一个模型。
Public Class ItemModel
Public Property Id as Guid
Public Property Text as String
End Class
在Window上,我创建了一个名为Items的ObservableCollection(Of ItemModel)属性。它包含3个项目,每个项目的Text属性设置为值“One”,“Two”或“Three”之一。每个项目的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(Of String),其中填充了值“One”,“Two”,“Three”和“Four”。 / p>
用户控件的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属性立即出现在ComboBox中。它还允许在ComboBox中选择不同的值,并在DataGrid中更新该值。
注意事项。
我希望这会有所帮助。