Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 未传播到目标或源的依赖项属性的强制值_C#_Wpf_Data Binding_Dependency Properties_Code Behind - Fatal编程技术网

C# 未传播到目标或源的依赖项属性的强制值

C# 未传播到目标或源的依赖项属性的强制值,c#,wpf,data-binding,dependency-properties,code-behind,C#,Wpf,Data Binding,Dependency Properties,Code Behind,问题: 在名为StorePicker的自定义控件中,我有一个名为SelectedStoreString的自定义依赖项属性(DP)。DP有一个属性ChangedCallback和一个强制值回调。DP双向绑定到视图模型中同名的属性。当在视图模型中为源分配了一个值时,将调用强制值回调,并返回应在目标DP和视图模型中的源之间传播的最终值(该值可能与分配的值相同,也可能与处理程序中更改的值不同) 然后将该值发送到属性ChangedCallback。问题在于,从强制值回调返回的强制值从未传播到目标或源。我使

问题

在名为
StorePicker
的自定义控件中,我有一个名为
SelectedStoreString
的自定义依赖项属性(DP)。DP有一个
属性ChangedCallback
和一个
强制值回调
。DP双向绑定到视图模型中同名的属性。当在视图模型中为源分配了一个值时,将调用
强制值回调
,并返回应在目标DP和视图模型中的源之间传播的最终值(该值可能与分配的值相同,也可能与处理程序中更改的值不同)

然后将该值发送到
属性ChangedCallback
。问题在于,从
强制值回调返回的强制值从未传播到目标或源。我使用的是DevExpress WPF框架的POCOViewModels,因此
INotifyPropertyChanged
接口是在后台实现的

代码

/--------------Poco视图模型--------------------------------------------------
[POCOViewModel]
公共类FindOrdersViewModel
{
公共虚拟字符串SelectedStoreString{get;set;}
公共FindOrdersViewModel()
{      
SelectedStoreString=“48,49,55”;
}
公共静态FindOrdersViewModel Create()
{
返回ViewModelSource.Create(()=>newfindordersviewmodel());
}
}
//--------------------依赖属性及其处理程序-----------------------------
public static dependencProperty SelectedStoreStringProperty=dependencProperty.Register(name of(SelectedStoreString)、typeof(string)、typeof(StorePicker)、new FrameworkPropertyMetadata(“,
默认情况下,FrameworkPropertyMetadataOptions.BindsTwoWay,
新属性ChangedCallback(在SelectedStoreStringChanged上),
新的强制值回调(强制选择存储字符串),
假,,
UpdateSourceTrigger.PropertyChanged));
公共字符串SelectedStoreString
{
得到
{
返回(字符串)GetValue(SelectedStoreStringProperty);//\u selectedStoreString;
}
设置
{
SetValue(SelectedStoreStringProperty,value);
}
}
SelectedStoreStringChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
StorePicker StorePicker=d作为StorePicker;
如果(d!=null)
{
Dictionary sDct=新字典();
foreach(门店内门店)
添加(store.store,store);
字符串值=e.NewValue作为字符串;
如果(值!=null&&value!=“”)
{
字符串[]strs=value.Split(',');
foreach(strs中的字符串s)
{
尝试
{
int x=转换为32(s);
门店外储=sDct[x];
如果(超出!=null)
{
如果(!outStore.InActive)
{
storePicker.listBoxEdit1.SelectedItems.Add(超出门店);
}
}
}
抓住
{
}
}
}
}
}
私有静态对象强制SelectedStoreString(DependencyObject d,object v)
{
StorePicker StorePicker=d作为StorePicker;
string finalSelectedStoresString=”“;//由于selectedstorestring可能包含非活动的存储代码,我们可能需要调整分配的字符串
如果(d!=null)
{
字符串[]存储代码=((字符串)v)=“”?新字符串[0]:((字符串)v).Split(',');
foreach(storeCodes中的字符串s)
{
存储温度=_stores.Find(x=>x.Store==Convert.ToInt32和&&!x.InActive);
如果(温度!=null)
{
finalSelectedStoresString+=temp.STORE+“,”;
}
}
如果(finalSelectedStoresString!=“”)
{
finalSelectedStoresString=finalSelectedStoresString.Remove(finalSelectedStoresString.Length-1,1);//如果字符串有结尾逗号,请从字符串中删除
}
}
返回finalSelectedStoresString;
}
//------------------------------控件在xml中的使用方式---------------------------------------
我所尝试的

  • PropertyChangedCallback
    调用
    storePicker.SetCurrentValue(SelectedStoreStringProperty,e.NewValue作为字符串)
    。如果我使用布尔状态变量来阻止无限循环,这要么导致无限循环回调,要么完全没有任何结果。但尽管如此,它并没有更新绑定

  • 将绑定模式设置为显式,并调用
    storePicker.GetBindingExpression(SelectedStoreStringProperty).UpdateSource()
    storePicker.GetBindingExpression(SelectedStoreStringProperty).UpdateTarget()
    手动更新绑定。仍然没有更新目标或源

  • 使用thes设置DP