我可以将按钮内容数据绑定交换到代码中的不同数据绑定吗?

时间:2013-10-05 19:52:36

标签: c# data-binding windows-phone-8

我找不到任何示例让我明白如何以及如果我可以通过单击按钮更改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"/>

我希望当用户更改切换开关的状态以更改

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

例如:

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

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

3 个答案:

答案 0 :(得分: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

了解详情

答案 1 :(得分: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以获取更多信息和更完整的示例。

答案 2 :(得分: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
}

您的ViewModel将保留ButtonTextCollection属性,并会根据切换进行更改。

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

如果要更改文字,可以更改ButtonTextCollection

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