錯誤是非常精確的...你不能雙向綁定你當前的DataContext
但只有屬性上下文中。
<DataTemplate DataType="{x:Type ClassTypeContainingABoolean}">
<CheckBox IsChecked="{Binding YourBooleanProperty}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type System:Boolean}">
<CheckBox IsChecked="{Binding Mode=OneWay}"/>
</DataTemplate>
取決於你真正想做什麼。
整個事情是從ContentPresenter
獨立。
如果要檢查你的DataContext對象,決定模板之前,您可以使用TemplateSelector
。
public class MyTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var elem = container as FrameworkElement;
if (item == null || elem == null)
{
return null;
}
var t = item.GetType();
var prop = t.GetProperty("PropertyValue");
if (prop == null)
{
return null;
}
// select template by the type of the PropertyValue parameter
if (typeof(bool?).IsAssignableFrom(prop.PropertyType))
{
return elem.FindResource("BooleanContextTemplate") as DataTemplate;
}
if (typeof(string).IsAssignableFrom(prop.PropertyType))
{
return elem.FindResource("StringContextTemplate") as DataTemplate;
}
return base.SelectTemplate(item, container);
}
}
例如數據上下文初始化:
public class MyContextData<T>
{
public T PropertyValue { get; set; }
}
// initialize DataContext somewhere
private void Window_Loaded(object sender, RoutedEventArgs e)
{
grid1.DataContext = new MyContextData<bool>() { PropertyValue = true };
//grid1.DataContext = new MyContextData<string>() { PropertyValue = "ABC" };
}
的XAML示例:
<Window.Resources>
<local:MyTemplateSelector x:Key="MyContextDataTemplateSelector"/>
<DataTemplate x:Key="StringContextTemplate">
<TextBox Text="{Binding PropertyValue}" MinWidth="100" MaxWidth="300"/>
</DataTemplate>
<DataTemplate x:Key="BooleanContextTemplate">
<CheckBox IsChecked="{Binding PropertyValue}"/>
</DataTemplate>
</Window.Resources>
<Grid x:Name="grid1">
<ContentPresenter Content="{Binding}" ContentTemplateSelector="{StaticResource MyContextDataTemplateSelector}"/>
</Grid>
正如你所看到的,是由模板選擇通過FindResource("BooleanContextTemplate")
引用的DataTemplate
需要定義某處。此外,templateselector本身在資源中創建並傳遞給ContentPresenter.ContentTemplateSelector
屬性。
請注意,ContentPresenter.Content
綁定不再針對YourBooleanProperty
,並且此屬性代替模板的一部分。因此,最終,您的數據需要以某種確定的方式進行打包,涉及相關的屬性名稱。
你想讓它根據PropertyValue的類型選擇一個模板嗎?你可能需要一個TemplateSelector。 –
是的。這就是我想要完成的 – Xegara
任何機會,你的問題不是*「爲什麼不工作」*而是*「如何讓Y工作」*? – grek40