2013-10-05 130 views
1

我找不到任何例子,让我明白如何以及如果我可以更改C#中的数据绑定点击一个按钮,在我的情况下切换开关,基本上我有32个按钮在我的应用程序和32个按钮的行为相同但需要使用不同的文本(取决于它们当前数据绑定的某些切换开关),以便可以从本地存储器保存和检索文本,但取决于这些切换开关的状态。我可以将按钮内容数据绑定交换到代码中的其他数据绑定吗?

所以我目前有:

<Button x:Name="_ovButton1" Content="{Binding Source={StaticResource AppSettings}, Path=ovName1_1Value, Mode=TwoWay}" Margin="2,0,250,0" VerticalAlignment="Top" FontSize="14" Height="72" FontWeight="Bold" MouseLeftButtonUp="_ovButton1_MouseLeftButtonUp" MouseLeftButtonDown="_ovButton1_MouseLeftButtonDown" ClickMode="Hover" Hold="_ovButton1_Hold"/> 

,我想,当用户更改toggleswitch的状态到

{StaticResource AppSettings}, Path=ovName1_1Value, Mode=TwoWay} 

改变,例如:

{StaticResource AppSettings}, Path=ovName1_2Value, Mode=TwoWay} 

但我找不到任何示例显示如何在c#中执行此操作。 需要执行哪些代码是什么?

+0

执行按钮执行基于文本不同的动作?换句话说,按钮1在点击时总是做'X'吗?或者当文本不同时它会“Y”? –

+0

不,让我澄清...这是总体目标:我有32个按钮,按下它们时的动作是相同的,不管怎样,但我希望标签根据所选的切换开关进行更改(只有一个一个时间)http://www.ctwo12.com/fsr/fsr5.png这是我可以让用户保存标签,让他们知道他们点击了什么......正如你可以在屏幕截图中看到你有6个切换和很多按钮我想要相同的按钮来说,例如在第一个按钮button1 page1上,然后当用户点击下一个切换按钮时,page1将变成button1 page2 ......这有意义吗? –

+0

因此,32个按钮,每个都执行不同的操作,但不管显示哪个文本,按钮1总是会执行'X'操作。为什么文本改变总是会出现'X'? –

回答

0

可以在这样的代码指定绑定的目标:

MyData myDataObject = new MyData(DateTime.Now);  
Binding myBinding = new Binding("MyDataProperty"); 
myBinding.Source = myDataObject; 
myText.SetBinding(TextBlock.TextProperty, myBinding); 

多见于http://msdn.microsoft.com/en-us/library/ms742863.aspx

+0

我已经看到了,但是在我上面的xaml代码中(我知道我对此感到非常愚蠢),但是代码中的哪一部分将路径部分放在一边,并且资源部分是否会去? –

0

- 编辑注我没有获得一个WP8模拟器来测试这一点 - -

在视图模型,它看起来像这样:

public List<string> Members 
{ 
    get { return _Members; } 
    set { _Members = value; OnPropertyChanged(); } 
} 
public MainVM() 
{ 
    // Simulate Asychronous access, such as to a db. 

    Task.Run(() => 
       { 
        Thread.Sleep(2000); 
        Members = new List<string>() {"Alpha", "Beta", "Gamma", "Omega"}; 
       }); 
} 

鳕鱼Ë后面的主网页设置的datacontext(与所有的子控件共享),为这样:

public MainWindow() 
{ 
    InitializeComponent(); 

    // Set the windows data context so all controls can have it. 
    DataContext = new MainVM(); 

} 

的网主页的Xaml结合成员是这样

<Button Height="30" 
     Width="80" 
     Margin="10" 
     DataContext="{Binding Members}" 
     Content="{Binding Path=[0] }" /> 

<Button Height="30" 
     Width="80" 
     Margin="10" 
     DataContext="{Binding Members}" 
     Content="{Binding Path=[1] }" /> 

<Button Height="30" 
     Width="80" 
     Margin="10" 
     DataContext="{Binding Members}" 
     Content="{Binding Path=[2] }" /> 

<Button Height="30" 
     Width="80" 
     Margin="10" 
     DataContext="{Binding Members}" 
     Content="{Binding Path=[3] }" /> 

结果是这样的视觉:

enter image description here

我此基础上我的博客文章中的XAML:ViewModel Main Page Instantiation and Loading Strategy for Easier Binding获取更多信息和更全面的例子。

0

我认为你最好的选择是使用字符串集合并绑定到该集合。您可以在切换切换时更改集合,也可以保留6个集合并绑定到用于切换的集合。

的XAML:

<ItemsControl x:Name="Buttons" ItemsSource="{Binding ButtonTextCollection}"> 
    <ItemsControl.ItemsPanel> 
     <toolkit:WrapPanel/> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Width="100" Height="70" Content="{Binding}" Click="OnButtonClick"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

代码隐藏会对您的按钮事件处理程序单击

private void OnButtonClick(object sender, RoutedEventArgs e) 
{ 
    var text = ((Button) sender).Content.ToString(); 
    // Send the text 
} 

您的视图模型将持有ButtonTextCollection财产,将改变基于切换。

public ICollection<string> ButtonTextCollection 
{ 
    get { return _buttonTextCollection; } 
    set 
    { 
     _buttonTextCollection = value; 
     OnPropertyChanged("ButtonTextCollection"); 
    } 
} 

当你要更改的文字,你会改变ButtonTextCollection

public void ChangeButtonText() 
{ 
    ButtonTextCollection = new Collection<string> {"A", "B",...}; 
}