2

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

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

数据模板 #1 是要加载的默认模板。我尝试将按钮命令绑定到Function1我的 DataContext 类中:

<Button Content="Button 1" CommandParameter="{Binding }" Command="{Binding DataContext.Function1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>

这实际上有效并且函数被绑定。但是,当我尝试将 Data Template #2 加载到同一个对象时(同时尝试将另一个按钮命令绑定Function2到来自我的 DataContext 类的不同函数()):

<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,我用它来包含我的两个视图模型的实例:

PageViewModels.Add(new ViewModel1());
PageViewModels.Add(new ViewModel2());

// Set starting page
CurrentPageViewModel = PageViewModels[0];

当我尝试将我CurrentPageViewModel的视图模型更改为另一个视图模型时,这就是我希望新绑定起作用的时候。不幸的是,事实并非如此。我做事的方式正确吗?

4

2 回答 2

1

如果由于某种原因你不能只使用两个不同的数据模板,通常是因为数据模板非常大或复杂,我建议使用ContentControland DataTemplateSelector

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

于 2013-07-01T10:19:48.590 回答
1

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

但是 TemplateSelector 方法会更有效。

于 2013-07-01T10:48:34.410 回答