我有ComboBox
需要依赖另一个ComboBox
的值。此部分已经有效,当在独立ComboBox
中选择新值时,依赖ComboBox
会刷新:
<!-- Independent -->
<ComboBox Height="23" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="2"
x:Name="cbo_product" VerticalAlignment="Center" Width="120"
ItemsSource="{Binding Source={StaticResource productsXml}}"
DisplayMemberPath="@name" SelectedValuePath="@name"
SelectionChanged="cbo_product_SelectionChanged"
SelectedValue="{Binding Path=Product}" />
<!-- Dependent -->
<ComboBox Height="23" HorizontalAlignment="Left" Grid.Row="3" Grid.Column="2"
x:Name="cbo_component" VerticalAlignment="Center" Width="201"
DataContext="{Binding SelectedItem, ElementName=cbo_product}"
ItemsSource="{Binding XPath=Components/Component}"
DisplayMemberPath="@name" SelectedValuePath="@name"
SelectedValue="{Binding Path=Component}"
SelectionChanged="cbo_component_SelectionChanged" />
在这背后的C#课中,我有:
public MyUserControlConstructor()
{
MyViewModelInstance= new MyViewModel();
DataContext = MyViewModelInstance;
}
在MyViewModel
,我有:
public string Component
{
get { return _component; }
set
{
if (value == _component)
{
return;
}
_component = value;
onPropertyChanged(PropertyNames.Component);
}
}
private void onPropertyChanged(PropertyNames fieldName)
{
if (null == PropertyChanged)
{
return;
}
string propertyName = Enum.GetName(typeof(PropertyNames), fieldName);
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
当我更改从属ComboBox
(组件)时,它会在我的应用中显示新值,当然。但是,当我点击一个导致显示Component
属性值的按钮时,它始终是初始值,而不是我在ComboBox
中选择的值。我认为我的XAML肯定有错误。对于C#,我尝试按照this和this guide的组合进行操作。如何将我的从属ComboBox
绑定到嵌套在独立SelectedItem
的{{1}}中的XML值,但仍然更新我班级中的ComboBox
属性?
编辑:我怀疑是因为我在两个地方为依赖Component
设置了DataContext
:首先在C#的构造函数中,我的观点模型,XAML中的第二个,ComboBox
。
编辑:我一直在构造函数中将初始值设置为我的视图模型类。当我取出DataContext="{Binding SelectedItem, ElementName=cbo_product}"
属性的初始值时,即使我更改了从属Component
中的选定值,我仍然没有从ComboBox
属性中获取任何值。这几乎只是重新解释了我已经知道的内容:依赖Component
与独立ComboBox
绑定(它从独立的ComboBox
获取数据,即),但不是{ {1}}属性。
编辑按要求,这是我的XML样本:
ComboBox
修改:在查看this和this后,我猜测Component
会有用。
编辑:好像我应该可以让相关的<Products xmlns="">
<Product name="Awesomeness">
<Components>
<Component name="Component of Glory"/>
<Component name="Component of Doom"/>
</Components>
</Product>
</Products>
无法设置MultiBinding
,只需使用ComboBox
:
DataContext
但是,这不起作用:从属ItemsSource
为空,而不是显示所有组件名称。
答案 0 :(得分:0)
我找到解决这个问题的方法涉及在C#中设置ItemsSource而不是XAML,我更喜欢而不是。然而,它有效,经过一天半的敲击,这是我想出的最好的。
在XAML中:
<!-- Independent -->
<ComboBox Height="23" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="2"
x:Name="cbo_product" VerticalAlignment="Center" Width="120"
ItemsSource="{Binding Source={StaticResource productsXml}}"
DisplayMemberPath="@name" SelectedValuePath="@name"
SelectionChanged="cbo_product_SelectionChanged"
SelectedItem="{Binding Path=ProductNode}"
SelectedValue="{Binding Path=Product}" />
<!-- Dependent -->
<ComboBox Height="23" HorizontalAlignment="Left" Grid.Row="3" Grid.Column="2"
x:Name="cbo_component" VerticalAlignment="Center" Width="201"
DisplayMemberPath="@name" SelectedValuePath="@name"
SelectedValue="{Binding Path=Component, Mode=TwoWay}"
SelectionChanged="cbo_component_SelectionChanged"/>
在C#中,独立ComboBox
更改时的事件处理程序:
private void cbo_product_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
// Set ItemsSource of dependent ComboBox
cbo_component.ItemsSource = getChildNodesFromComboBox(
sender as ComboBox, "Components/Component"
);
cbo_component.SelectedIndex = 0;
}
// Helper method to do XPath query and get child nodes from selected value of
// independent ComboBox
private XmlNodeList getChildNodesFromComboBox(ComboBox comboBox,
string xpath)
{
if (null == comboBox)
{
return null;
}
var xml = comboBox.SelectedItem as XmlElement;
if (null == xml)
{
return null;
}
return xml.SelectNodes(xpath);
}
现在,我的视图模型类中的Component
属性(我的依赖项ComboBox
在XAML中绑定)将填充在从属ComboBox
中选择的值,因为我没有必须更改从属DataContext
的{{1}}。