Ser*_*que 5 c# data-binding wpf binding linq-to-xml
为什么数据绑定TwoWay不能在.net 4.0中的组合框的文本属性上工作(它在.net 3.5中工作)?
我的代码:
我有一个像这样的xml文件:
<xml>
<combobox option="" obs="tralala">
<option value="here" />
<option value="there" />
</combobox>
<combobox option="blue" obs="">
<option value="one" />
<option value="two" />
<option value="three" />
</combobox>
</xml>
Run Code Online (Sandbox Code Playgroud)
我有这样的ListItem控制:
<ListBox DataContext="{Binding UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<ComboBox MinWidth="75" IsEditable="True"
IsReadOnly="False" DockPanel.Dock="Left"
DataContext="{Binding Path=Element[combobox ]}"
IsSynchronizedWithCurrentItem="False"
ItemsSource="{Binding Path=Elements[option], UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Attribute[value].Value"
Text="{Binding Path=Attribute[option].Value, UpdateSourceTrigger=PropertyChanged}"
/>
<TextBox MinWidth="150" AcceptsReturn="False"
AcceptsTab="False" TextWrapping="NoWrap"
Text="{Binding Path=Attribute[obs].Value, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
这是后面的代码:
XDocument xdXml;
public MyWindow()
{
xdXml = XDocument.Load(@"C:\file.xml");
InitializeComponent();
DataContext = xdXml;
xdXml.Changed += new EventHandler<XObjectChangeEventArgs>(XdXml_Changed);
}
private void XdXml_Changed(object sender, XObjectChangeEventArgs e)
{
xdXml.Save(@"C:\fichier.xml");
}
Run Code Online (Sandbox Code Playgroud)
我喜欢这样,因为我可以ComboBox使用不同的自定义选项进行自动完成,但我可以编写我想要的内容,结果在元素的属性选项中<combobox>
如果我的目标是.net 3.5,它可以正常工作,但如果我的目标是.net 4.0,则只能绑定文本框
为什么?我能做什么?
这是使用框架 4.0 执行此代码的解决方案(我尝试将其适应您的示例,但我不确定。无论如何,这就是想法):
ListItem像这样改变你的控制:
<ListBox DataContext="{Binding UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}"
IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<!-- Add this collapsed textbox -->
<TextBox Visibility="Collapsed" DataContext="{Binding Path=Element[combobox]}" Text="{Binding Path=Text, ElementName=cbxComboBox, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged" />
<!-- Name the Combobox -->
<ComboBox Name="cbxComboBox" MinWidth="75" IsEditable="True"
IsReadOnly="False" DockPanel.Dock="Left"
DataContext="{Binding Path=Element[combobox]}"
IsSynchronizedWithCurrentItem="False"
ItemsSource="{Binding Path=Elements[option], UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Attribute[value].Value"
Text="{Binding Path=Attribute[option].Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
/>
<TextBox MinWidth="150" AcceptsReturn="False"
AcceptsTab="False" TextWrapping="NoWrap"
Text="{Binding Path=Attribute[obs].Value, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
你的新代码是:
XDocument xdXml;
public MyWindow()
{
xdXml = XDocument.Load(@"C:\file.xml");
InitializeComponent();
DataContext = xdXml;
xdXml.Changed += new EventHandler<XObjectChangeEventArgs>(XdXml_Changed);
}
private void XdXml_Changed(object sender, XObjectChangeEventArgs e)
{
xdXml.Save(@"C:\fichier.xml");
}
// finally, add this event:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (((XElement)((FrameworkElement)sender).DataContext).Attribute("option").Value != ((TextBox)sender).Text)
{
((XElement)((FrameworkElement)sender).DataContext).Attribute("option").Value = ((TextBox)sender).Text;
}
}
Run Code Online (Sandbox Code Playgroud)
为了理解,请看一下:
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |