gpt4 book ai didi

c# - XAML - 为什么数据绑定(bind) TwoWay 不适用于 .net 4.0 中组合框的文本属性?

转载 作者:太空狗 更新时间:2023-10-29 23:42:09 26 4
gpt4 key购买 nike

为什么数据绑定(bind) 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>

我有一个 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>

下面是代码:

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");
}

我喜欢那样,因为我可以拥有一个 ComboBox每个都有不同的自定义选项自动完成,但我可以写我想要的,结果在元素的属性选项中 <combobox>

如果我以 .net 3.5 为目标,它工作正常,但如果我以 .net 4.0 为目标,则只能绑定(bind)文本框

为什么?我能做什么?

最佳答案

这是使用 framework 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>

你的新代码是:

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;
}
}

要了解,请看一下:

关于c# - XAML - 为什么数据绑定(bind) TwoWay 不适用于 .net 4.0 中组合框的文本属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com