ContentControl DataTemplate绑定到基本类型

时间:2016-04-19 12:46:05

标签: c# wpf data-binding datatemplate contentcontrol

我有一个可以是原始类型的视图模型:

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的类型可以是floatintbool。现在,如果TextBox类型为Valuefloat,则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; 属性的值。我该如何进行双向绑定?有没有更好的方法来做我想做的事情?

1 个答案:

答案 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>

记得将模板的内容绑定到数据