我有一个可以是原始类型的视图模型:
class VM : VMBase // implements INotifyProperty
{
// can be float, int or bool (System.Single, System.Int32, System.Boolean)
private object _Value;
public object Value {
get{return _Value;}
set{
if(_Value!=value){
_Value=value;
OnPropertyChanged(nameof(Value)); // notify bindings
}
}
}
}
Value
的类型可以是float
,int
或bool
。现在,如果TextBox
类型为Value
或float
,则int
显示CheckBox
,如果&{39},则显示bool
; sa <Grid> <!-- DataContext is VM -->
<Grid.Resources>
<DataTemplate DataType="{x:Type sys:Single}">
<TextBox Width="64" Text="{Binding Path=DataContext.Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type sys:Int32}">
<TextBox Width="64"/>
</DataTemplate>
<DataTemplate DataType="{x:Type sys:Boolean}">
<CheckBox Width="64"/>
</DataTemplate>
</Grid.Resources>
<ContentControl Content="{Binding Value}" IsTabStop="False"/>
</Grid>
。在XAML中我试试这个:
Value
它为每种类型正确显示控件。但是我无法通过在其文本框中键入新值来使用绑定来修改SELECT *
FROM Doctor
JOIN DoctorKeyword ON(Doctor.id = DoctorKeyword.idDoctor)
JOIN Keyword ON(Keyword.id = DoctorKeyword.idKeyword)
WHERE Keyword.word = 'test'
OR Keyword.word='anotherTest'
HAVING COUNT(DoctorKeyword.idKeyword) = 2;
属性的值。我该如何进行双向绑定?有没有更好的方法来做我想做的事情?
答案 0 :(得分:0)
正确地发现您需要为每个数据视图指定一个模板,您缺少的部分是您可以使用DataTemplateSelector来选择正确的
例如
码
public class CustomTemplateSelector : DataTemplateSelector
{
public DataTemplate Template1{get;set;}
public DataTemplate Template2{get;set;}
public DataTemplate Template3{get;set;}
public DataTemplate Template4{get;set;}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if(item is float)
return Template1;
else if(item is int)
return Template1;
else if(item is string)
return Template2;
else if(item is bool)
return Template3;
//etc
else
return Template4;
}
}
XAML
<local:CustomeDataTemplate>
<local:CustomeDataTemplate.Template1>
<DataTemplate>
<TextBox Text="{Binding }" />
</DataTemplate>
</local:CustomeDataTemplate.Template1>
<local:CustomeDataTemplate.Template2>
<DataTemplate>
<CheckBox IsChecked="{Binding }"/>
</DataTemplate>
</local:CustomeDataTemplate.Template2>
</local:CustomeDataTemplate>
记得将模板的内容绑定到数据