在WPF中取消设置/更改绑定

时间:2013-07-01 09:08:52

标签: c# wpf mvvm binding

如何取消设置应用于对象的绑定,以便我可以从其他位置对其应用另一个绑定?

假设我有两个绑定到相同对象引用的数据模板。

数据模板#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更改为其他视图模型时,这就是我希望新绑定工作的时候。不幸的是,事实并非如此。我是以正确的方式做事吗?

2 个答案:

答案 0 :(得分:1)

如果由于某种原因您无法仅使用两个不同的DataTemplates,通常是因为数据模板非常大或复杂,我建议使用ContentControlDataTemplateSelector

在DataTemplates中放置另一个ContentControl,创建2个只包含按钮的DataTemplates,一个包含Function1,一个包含Function2。创建一个DataTemplateSelector并在初始ContentControl上设置它。 DataTemplateSelector现在只需要根据决定选择合适的模板,例如项目的类型或项目上的属性等。

答案 1 :(得分:1)

如果您仍想取消设置绑定,可以使用以下代码执行此操作:     BindingOperations.ClearBinding(txtName, TextBox.TextProperty)

但是TemplateSelector方法会更有效率。