如何取消设置应用于对象的绑定,以便我可以从其他位置对其应用另一个绑定?
假设我有两个绑定到相同对象引用的数据模板。
数据模板#1是要加载的默认模板。我尝试将一个按钮命令绑定到我的DataContext类的Function1
:
<Button Content="Button 1" CommandParameter="{Binding }" Command="{Binding DataContext.Function1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
这实际上有效并且函数被绑定。但是,当我尝试将Data Template#2加载到同一个对象时(尝试将另一个按钮命令绑定到我的DataContext类中的另一个函数(Function2
)):
<Button Content="Button 2" CommandParameter="{Binding }" Command="{Binding DataContext.Function2, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
它不起作用,第一个绑定仍然是执行的绑定。有解决方法吗?
编辑(针对更好的问题背景):
我在Window.Resources中定义了我的模板:
<Window.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<local:View1 />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel2}">
<local:View2 />
</DataTemplate>
</Window.Resources>
View1.xaml和View2.xaml包含我上面描述的按钮定义(我希望它们命令控制我的流程)。
ViewModel1和ViewModel2是我的ViewModel,它实现了接口IPageViewModel
,这是我的变量CurrentPageViewModel
的类型。
在我的XAML中,我将ContentControl
绑定到变量CurrentPageViewModel
:
<ContentControl Content="{Binding CurrentPageViewModel}" HorizontalAlignment="Center"/>
在我的.CS中,我有一个定义为List<IPageViewModel> PageViewModels
的列表,我用它来包含我的两个View Models的实例:
PageViewModels.Add(new ViewModel1());
PageViewModels.Add(new ViewModel2());
// Set starting page
CurrentPageViewModel = PageViewModels[0];
当我尝试将CurrentPageViewModel
更改为其他视图模型时,这就是我希望新绑定工作的时候。不幸的是,事实并非如此。我是以正确的方式做事吗?
答案 0 :(得分:1)
如果由于某种原因您无法仅使用两个不同的DataTemplates,通常是因为数据模板非常大或复杂,我建议使用ContentControl
和DataTemplateSelector
。
在DataTemplates中放置另一个ContentControl
,创建2个只包含按钮的DataTemplates,一个包含Function1,一个包含Function2。创建一个DataTemplateSelector
并在初始ContentControl上设置它。 DataTemplateSelector
现在只需要根据决定选择合适的模板,例如项目的类型或项目上的属性等。
答案 1 :(得分:1)
如果您仍想取消设置绑定,可以使用以下代码执行此操作:
BindingOperations.ClearBinding(txtName, TextBox.TextProperty)
但是TemplateSelector方法会更有效率。