gpt4 book ai didi

c# - WPF 组合框 : Set SelectedItem to item not in ItemsSource -> Binding oddity

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:06 24 4
gpt4 key购买 nike

我想实现以下目标:我想要一个显示可用 COM 端口的 ComboBox。在启动时(并单击“刷新”按钮),我想获取可用的 COM 端口并将选择设置为最后选择的值(来自应用程序设置)。

如果设置值(最后一个 COM 端口)不在值列表(可用 COM 端口)中,则会发生以下情况:

虽然 ComboBox 不显示任何内容(它“足够聪明”知道新的 SelectedItem 不在 ItemsSource 中),但 ViewModel 更新为“无效值”。我实际上希望 Binding 具有与 ComboBox 显示的相同的值。

演示代码:

主窗口.xaml:

    <Window x:Class="DemoComboBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:DemoComboBinding">
<Window.Resources>
<local:DemoViewModel x:Key="vm" />
</Window.Resources>
<StackPanel Orientation="Vertical">
<ComboBox SelectedItem="{Binding Source={StaticResource vm}, Path=Selected}" x:Name="combo"
ItemsSource="{Binding Source={StaticResource vm}, Path=Source}"/>
<Button Click="Button_Click">Set different</Button> <!-- would be refresh button -->
<Label Content="{Binding Source={StaticResource vm}, Path=Selected}"/> <!-- shows the value from the view model -->
</StackPanel>
</Window>

主窗口.xaml.cs:

    // usings removed
namespace DemoComboBinding
{
public partial class MainWindow : Window
{
//...
private void Button_Click(object sender, RoutedEventArgs e)
{
combo.SelectedItem = "COM4"; // would be setting from Properties
}
}
}

View 模型:

    namespace DemoComboBinding
{
class DemoViewModel : INotifyPropertyChanged
{
string selected;

string[] source = { "COM1", "COM2", "COM3" };

public string[] Source
{
get { return source; }
set { source = value; }
}

public string Selected
{
get { return selected; }
set {
if(selected != value)
{
selected = value;
OnpropertyChanged("Selected");
}
}
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

void OnpropertyChanged(string propertyname)
{
var handler = PropertyChanged;
if(handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyname));
}
}

#endregion
}
}

我最初想出的一个解决方案是在 Selected setter 中检查要设置的值是否在可用 COM 端口列表中(如果不在,则设置为空字符串并发送 OPC)。

我想知道的是:为什么会这样?还有其他我没看到的解决方案吗?

最佳答案

简而言之,您不能将SelectedItem 设置为不在ItemsSource 中的值。据我所知,这是所有 Selector 的默认行为后代,这是相当明显的:设置 SelectedItem 不仅是数据更改,这还应该导致一些视觉效果,例如生成项目容器和重新绘制项目(所有这些操作 ItemsSource).你在这里能做的最好的就是这样的代码:

public DemoViewModel()
{
selected = Source.FirstOrDefault(s => s == yourValueFromSettings);
}

另一种选择是允许用户在 ComboBox 中输入任意值,方法是使其可编辑。

关于c# - WPF 组合框 : Set SelectedItem to item not in ItemsSource -> Binding oddity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26376772/

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