0

我原以为这个问题已经得到了回答,但我没有找到。我有一个简单的课程:

public class BinanceEndpoint : ObservableObject
    {
        private string baseAddress;
        private string socketBaseAddress;

        public string BaseAddress
        {
            get { return baseAddress; }
            set { baseAddress = value; RaisePropertyChangedEvent(nameof(BaseAddress)); }
        }

        public string SocketBaseAddress
        {
            get { return socketBaseAddress; }
            set { socketBaseAddress = value; RaisePropertyChangedEvent(nameof(SocketBaseAddress)); }
        }
    }

然后,我使用该类中的对象填充 ObservableDictionary:

    private MainViewModel()
    {
 private BinanceEndpoint apiEndPoint;
        private ObservableDictionary<string, BinanceEndpoint> endPoints = new ObservableDictionary<string, BinanceEndpoint>();
        
        endPoints.Add("Binance.com", new BinanceEndpoint() { BaseAddress = "https://api.binance.com", SocketBaseAddress = "wss://stream.binance.com:9443", });
                    endPoints.Add("Binance.us", new BinanceEndpoint() { BaseAddress = 
    
        "https://api.binance.us", SocketBaseAddress = "wss://stream.binance.us:9443", });
                        endPoints.Add("Testnet", new BinanceEndpoint() { BaseAddress = "https://testnet.binance.vision", SocketBaseAddress = "wss://testnet.binance.vision", });
        }
        [JsonIgnore]
                public ObservableDictionary<string,BinanceEndpoint> EndPoints
                {
                    get { return endPoints; }
                    set { endPoints = value; RaisePropertyChangedEvent(nameof(EndPoints)); }
                }

public BinanceEndpoint APIEndPoint
        {
            get { return apiEndPoint; }
            set { apiEndPoint = value; RaisePropertyChangedEvent(nameof(APIEndPoint)); }
        }
    }

然后我尝试使用 ObservableDictionary 填充 ComboBox。

<ComboBox Grid.Column="1" ItemsSource="{Binding EndPoints}" DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding Path=APIEndPoint, Mode=TwoWay}"/>

我遇到的问题是 SelectedValue 在加载时不会更新 ComboBox 的值。我究竟做错了什么?

4

1 回答 1

0

您应该首先避免绑定到 a Dictionary。.NET 库中没有 ObservableDictionary 是有原因的——自 2002 年发布以来。我想我们同意这不是因为这些年来 MS 开发人员不知道如何实现这样的字典。

你用错了SelectedValuePath。返回指向的属性的值。在. 当您主动设置 时,控件将尝试查找并选择由 指定的项的属性与 的值匹配的项。SelectedValueSelectedValueSelectedValuePathSelectedValuePathSelectedItem
SelectedValueSelectedValuePathSelectedValue

SelectedItem返回选定项(实例)时,然后返回使用指定SelectedValue的 this 的属性值。SelectedItemSelectedValuePath

例如:我们绑定到一个Dictionary<string, BinanceEndpoint>. 为了显示Key您的,Dictionary我们指定了DisplayMemberPath(作为 a 的替代品DataTemplate)。
SelectedItem举行KeyValuePair<string, BinanceEndpoint>
ComboBox.SelectedValue返回所选项目的SocketBaseAddress值,我们必须将 设置SelectedValuePath"Value.SocketBaseAddress"

<ComboBox x:Name="ComboBox" 
          ItemsSource="{Binding EndPoints}" 
          DisplayMemberPath="Key" 
          SelectedValuePath="Value.SocketBaseAddress" />

<!-- Display the selected item's SocketBaseAddress value -->
<TextBlock text="{Binding ElementName=ComboBox, Path=SelectedValue}" />

如果要SelectedValue返回BinanceEndpoint实例,请设置SelectedValuePath"Value"

<ComboBox x:Name="ComboBox" 
          ItemsSource="{Binding EndPoints}" 
          DisplayMemberPath="Key" 
          SelectedValuePath="Value" />

<!-- Display the selected item's 'SocketBaseAddress' value -->
<TextBlock text="{Binding ElementName=ComboBox, Path=SelectedValue.SocketBaseAddress}" />
于 2021-10-01T09:01:55.570 回答