Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Combobox与Dictionary对象绑定,但在代码隐藏中设置选定值无效_C#_Wpf_Combobox_Binding_Selectedvalue - Fatal编程技术网

C# 将Combobox与Dictionary对象绑定,但在代码隐藏中设置选定值无效

C# 将Combobox与Dictionary对象绑定,但在代码隐藏中设置选定值无效,c#,wpf,combobox,binding,selectedvalue,C#,Wpf,Combobox,Binding,Selectedvalue,这是我在XAML中实例化的组合框 <Combobox ItemsSource="{Binding Path=Delimiters}" DisplayMemberPath="Key" SelectedValue="{Binding Path=SelectedDelimiter, UpdateSourceTrigger=PropertyChanged}" /> 我在绑定所选值时遇到问题。字典正在绑定,当我更改UI组合框时,设置被正确触发。在检查其是否为非法分隔符的i

这是我在XAML中实例化的
组合框

<Combobox ItemsSource="{Binding Path=Delimiters}" DisplayMemberPath="Key"
          SelectedValue="{Binding Path=SelectedDelimiter, UpdateSourceTrigger=PropertyChanged}" />
我在绑定所选值时遇到问题。
字典
正在绑定,当我更改UI
组合框
时,设置被正确触发。在检查其是否为非法分隔符的if语句中,它确实会将所选值设置回代码隐藏中的原始值,但不会填充到
组合框
UI(我看到get访问器从UI中启动)。它就像设置
SelectedValue
对用户界面没有任何作用


如果有人能给我指出正确的方向?

如果要使用
SelectedValue
,您应该将
SelectedValuePath设置为
Value
SelectedValue
正在进行“选择”,因此您的属性类型也应该不同


如果要保留整个
KeyValuePair
则应绑定
SelectedItem

花了一段时间才弄清楚,我的设置是正确的,但因为我正在更新setter中的相同属性,我需要使用dispatcher创建一个新线程来正确执行更新。

我以前将
SelectValuePath=Value
和我的SelectedDelimiter作为字符,但当我试图更改它时,它会导致相同的行为。。我也尝试过用KvP绑定SelectedItem,但没有任何更改。@Tim:您真的在代码中设置了属性吗?如果您设置该字段,绑定将永远不会更新,因为不会引发任何通知。我面临着类似的问题。。如果您还记得,您能告诉我“更新setter中的相同属性”是什么意思吗??
private IDictionary<string,string> _delimiters;

public IDictionary<string,string> Delimiters
{
   get{return _delimiters;}
   set{_delimiters = value;  RaisePropertyChanged("Delimiters");}
}

private KeyValuePair <string, string> _selectedDelimiter;
public KeyValuePair <string, string> SelectedDelimiter
{
    get{return _selectedDelimiter;}
    set{
       if(value.Key != _selectedDelimiter.Key || value.Value != _selectedDelimiter.Value)
       {
           var prevDelimiter = _selectedDelimiter;
           _selectedDelimiter = value;
           if(IllegalDelimiter.Contains(_selectedDelimiter)
           {
                 MessageBox.Show("errror", "error");
                 _selectedDelmiter = prevDelimiter;
           }
           RaisePropertyChanged("SelectedDelimiter");
       }

    }
}